我想在“单词边界”匹配一组模式,但这些模式可能有一个前缀 [#@],如果存在的话应该匹配。
我在 python 中使用以下正则表达式模式。
r"\b[@#]?(abc|ef|ghij)\b"
示例文本是:#abc 是应该匹配的模式。 abc 也应该匹配。最后@ef
在本文中,只有 abc、abc 和 ef 匹配,而不是像我想要的那样匹配 #abc 和 @ef。
最佳答案
您需要将单词边界放在您设为可选的 [@#]
旁边。因为在这个#abc
部分中,#
之前存在非单词边界\B
(不是单词字符)并且在行开头之后(不是单词字符)不是单词边界 \b
。请注意,\b
匹配单词字符和非单词字符,反之亦然。 \B
匹配两个单词字符或两个非单词字符。
r"[@#]?\b(abc|ef|ghij)\b"
如果将 \b
放在 [@#]
之前,它将匹配 foo@abc
或 bar#abc 等字符串
因为这里在@
和#
之前实际上存在一个单词边界。
示例:
>>> s = "#abc is a pattern which should match. also abc should match. And finally @ef"
>>> re.findall(r'[@#]?\b(?:abc|ef|ghij)\b', s)
['#abc', 'abc', '@ef']
#abc
^ ^
\B \b
关于Python正则表达式未按要求在单词边界匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29562943/