【问题标题】:Regex to match \d\d_\d\d\d only正则表达式仅匹配 \d\d​​_\d\d\d
【发布时间】:2017-05-08 00:21:31
【问题描述】:

你能帮我定义一个正则表达式吗:

  • 匹配单词r'(\d+_\d\d\d(?:_back)?)'
  • “word”表示除了正确的标点符号或字符串/行的开头/结尾之外,不应在其前面或后面添加任何内容
  • 可在多行字符串、字符串中的任何位置以及仅包含此模式且不包含其他内容的字符串中工作
  • %96_175"44_5555 中不匹配(因为% 和第四个“5”都不是标点符号)。

示例: 通过(12_345、012_345 或 012_345_back 是找到的组):

['12_345',
 'bla-bla 012_345',
 'bla-bla 12_345 bla-bla',
 '34\n012_345',
 '012_345\n34',
 'text—012_345—text',
 'text--12_345, text',
 'text. 012_345_back.']

失败(此处不匹配):

[
 'text12_345',
 '12_345text',
 '12_3456',
 '%12_345',
 '!12_345',
 '.12-345',
 '12_345_front'
]

我要区分的是形式 \d+_\d\d\d(?:_back) 的正确标识符,由用户在我的网站的评论中插入,来自相同的字符串另一个字符串的一部分。简单的正则表达式一直有效,直到有人插入指向以“№_175”结尾的维基百科文章的链接,该文章的 URL 编码为 %E2%84%96_175,“96_175”与我的模式匹配。

我一直在尝试匹配“正确的标点符号”或字符串的开头或结尾或字符串中的行。到那时,正则表达式已经非常复杂(我列出了我能想到的所有合理的 unicode 标点符号),以至于我认为我做错了什么。我也很难排除多余的数字,但包括可能的行尾或字符串。

【问题讨论】:

  • “正确的标点符号”相当模糊;那里有很多……
  • 如果您可以发布一组通过/失败字符串进行测试,这将有助于澄清您的问题。
  • @deceze,这正是我的问题。也许我确实应该列出一个合理的清单,如果以后需要,可以添加更多。那么我的问题可以简化为如何做标点符号或字符串开头|字符串结尾|行开头|行尾。
  • @PeterGibson,好主意,完成了。
  • remeber user r"..." 我知道您需要找到该组吗(有或没有 _back 或只回答是或否?

标签: regex python-3.x


【解决方案1】:

根据您需要如何处理(或不处理)非字母非正确标点符号,您可以依赖 Python 重新单词检测 \b (如答案之一所建议)或枚举“正确”开头和结尾不匹配组中的标点符号。

使用旧的正则表达式 (Python 2.5),您可以使用标点通配符 \p

(?:\p*|^|\s)(\d+_\d\d\d)(_back)?(?:\n|\p|$|\s)

使用现代 re(Python 2.6 及更高版本) 只需将 \p 替换为 string.punctuation 沿线 https://stackoverflow.com/a/37708340/5874981

首先,假设足够“正确”只是句号、逗号和连字符尝试

(?:^|\s|\.|,|-)(\d+_\d\d\d)(_back)?(?:$|\s|\.|,|-)

【讨论】:

  • 我可以自己定义标点符号列表。然而,无论出于何种原因,这个解决方案在一些没有找到的例子上都失败了:repl.it/Hmfk/0
  • 记住也要避开像\这样的标点符号。
  • 标点符号很棘手,因为许多标点符号在 re.例如 '。' (点)在默认模式下匹配除换行符以外的任何字符。括号表示一个组,问号有很多含义,具体取决于后面的字符。幸运的是,反斜杠可用于精确匹配您需要的任何重载标点符号
  • 就是这样!我放在那里。代替 \。所以现在它可以工作了:repl.it/Hmfk/1。谢谢!
  • 你为什么要把反斜杠放在逗号、连字符上?它们并不特别,不是吗?请回答这个问题,然后我将编辑您的答案以包含我的模式(或自己从repl.it/Hmfk/3 获取),然后我将接受您的答案。顺便说一句,如果你有 \s,你就不需要 \n。
【解决方案2】:

我不确定我是否误解了这个问题,但如果您遇到的唯一问题是匹配整个单词并忽略除您想要的字符之外的任何其他字符,我建议您尝试@987654321 @

所以你的正则表达式是\b\d+_\d\d\d(?:_back)?\b

试一试,告诉我是否需要。

【讨论】:

  • 它会匹配后跟“不可打印符号”(既不是字母、标点符号也不是下划线)的单词?如果@texnic 不关心这些,可能是一种方法
  • 它匹配%12_345,但不应该。我要区分的是由用户在我网站的评论中插入的表单 \d+_\d\d\d(?:_back) 的正确标识符,而同一字符串是另一个字符串的一部分。简单的正则表达式一直有效,直到有人插入指向以“№_175”结尾的维基百科文章的链接,该文章的 URL 编码为 %E2%84%96_175,“96_175”与我的模式匹配。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-16
  • 2017-07-06
  • 1970-01-01
  • 2019-02-14
  • 2017-02-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多