2 回答
TA贡献1842条经验 获得超21个赞
您可能正在寻找
import re
text = "123 Lorem ipsum dolor sit amet, word WORD WoRd consetetur sadipscing elitr, sed diam 123"
pattern = re.compile(r'\bword\b', re.IGNORECASE)
for word in pattern.finditer(text):
print(word.group(0))
这会产生
word
WORD
WoRd
\b是缩写形式
(?:(?=\w)(?<!\w)|(?<=\w)(?!\w))
其中读到
(?=\w)(?<!\w) # positive lookahead making sure there's a word character coming
# negative lookbehind making sure theres' n word characte preceding
| # or
(?<=\w)(?!\w) # the other way round
所以,是的
(?:(?=\w)(?<!\w)|(?<=\w)(?!\w))word(?:(?=\w)(?<!\w)|(?<=\w)(?!\w))
会产生与上面相同的匹配,但似乎有点不可读。
TA贡献1835条经验 获得超7个赞
(?<![^a-zA-Z0-9]) 是双重否定。您是说,如果主表达式之前的字符不在 [a-zA-Z0-9] 中,则它不应该匹配,也就是说,只有当该字符在 [a-zA-Z0-9] 中时,它才能匹配。只需删除 ^: (?<![a-ZA-Z0-9])。
您使用的字符串边界 ^ 和 $ 在这里会令人困惑,但如果您使用负向后查找和负向前查找,则不需要它们。
因此,切换到(?<![a-zA-Z0-9])(word|WORD)(?![a-zA-Z0-9])。
也就是说,@user3783243 关于 \b 的评论是一个更好的选择。\b 是一个“单词边界”,它准确地代表了您要捕获的内容。
添加回答
举报