你能帮我定义一个正则表达式吗?
r'(\d+_\d\d\d(?:_back)?)'%96_175"和44_5555中不匹配(因为%和第4个"5“都不是标点符号)。例如: Pass (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)的正确标识符,它是由用户在我的网站中的注释中插入的,与同一字符串是另一个字符串的一部分。简单的regex一直有效,直到有人插入一个指向维基百科文章的链接,文章的结尾是“%E2%84%96_175 _175”,该链接由URL编码到96_175,与我的模式相匹配。
我被困在试图匹配“适当的标点符号”或字符串或行的开头或结尾。到那时,正则表达式已经非常复杂了(我列出了我能想到的所有合理的unicode标点符号),以至于我觉得自己做错了什么。我也有困难排除额外的数字,但包括可能的结束行或字符串。
发布于 2017-05-08 01:23:41
取决于您需要如何处理(或不处理)非字母非正确标点符号,您可以依赖Python re单词检测\b (如其中一个答案所建议的)或枚举非匹配组中的“适当”标点符号。
使用旧正则表达式(Python2.5),可以使用标点符号通配符\p
(?:\p*|^|\s)(\d+_\d\d\d)(_back)?(?:\n|\p|$|\s)使用现代re (Python2.6及更高版本),只需将\p替换为string.punctuation,类似于https://stackoverflow.com/a/37708340/5874981
对于初学者,假设足够的“适当”只是句号,逗号和连字符尝试
(?:^|\s|\.|,|-)(\d+_\d\d\d)(_back)?(?:$|\s|\.|,|-)发布于 2017-05-08 03:55:02
我不知道我是否误解了这个问题,但如果你唯一的问题是匹配一个完整的单词,忽略任何你想要的字符,我建议你试试正则词边界。
所以您的正则表达式将是\b\d+_\d\d\d(?:_back)?\b
试一试,告诉我这是否是你所需要的。
https://stackoverflow.com/questions/43838096
复制相似问题