Python正则表达式未按要求在单词边界匹配

标签 python regex

我想在“单词边界”匹配一组模式,但这些模式可能有一个前缀 [#@],如果存在的话应该匹配。

我在 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@abcbar#abc 等字符串因为这里在@#之前实际上存在一个单词边界。

DEMO

示例:

>>> 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/

相关文章:

mysql 子字符串/从字符串中获取 id

python - 添加后列表的最后一项没有改变

python - 填充预定义的 pandas 数据框

python - '\' 可以在 Python 字符串中吗?

python - 在 Python 中一次为一个对象分配多个属性

regex - 在双正斜杠和/或使用 RegExp 的特定单词上拆分字符串

python - 字典中的重复项(Python)

java - 用于匹配未被引号包围的逗号的正则表达式

python - 正则表达式也使用 for 循环获取索引

c++ - Xcode 中 POSIX RegEx 的奇怪结果