【发布时间】: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