正则表达式匹配\ d \ d_ \ d \ d \ d

时间:2017-05-08 00:21:32

标签: regex python-3.x

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

  • 匹配单词r'(\d+_\d\d\d(?:_back)?)'
  • "字"意味着除了正确的标点符号或字符串/行的开头/结尾之外,不应该先于或后跟任何内容
  • 使用多行字符串,字符串中的任何位置以及仅包含此模式的字符串
  • %96_175"44_5555不匹配(因为%和第4" 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)的正确标识符,来自同一个字符串另一个字符串的一部分简单的正则表达式工作,直到有人插入维基百科文章的链接,以#34;№_175'结尾,其URL编码为%E2%84%96_175," 96_175"匹配我的模式。

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

1 个答案:

答案 0 :(得分:1)

根据你需要如何处理(或不处理)非字母非正确标点符号,你可以依靠Python重新检测字符\ b(如答案之一所示)或列举&#39 ;适当'打开和关闭非匹配组中的标点符号。

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

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

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

对于初学者,假设足够“适当”'只是句号,逗号和连字符尝试

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