请你帮我定义一个正则表达式:
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标点字符),我认为我做错了。我也很难排除额外的数字,但包括可能的行尾或字符串。
答案 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|\.|,|-)