python正则表达式来检测单词是否存在

2024-06-26 14:43:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用python正则表达式检测一个单词是否在一个句子中。同时,希望能够否定它。在

import re
re.match(r'(?=.*\bfoo\b)', 'bar red foo here')

这段代码可以工作,但是我不明白为什么我需要把.*放在那里。 也要否定它,我不知道该怎么做。 我试过:

^{pr2}$

但它不起作用。 我的最终目标是这样组合它们:

re.match(r'(?=.*\bfoo\b)(?!=.*\bbar\b)', 'bar red foo here')

Tags: 代码importreherefoomatchbarred
3条回答

您需要.*,因为re.match()试图将模式与字符串的开头相匹配。如果要搜索整个字符串,请使用re.search()。在

正如你可以做if re.search(...):,你也可以做if not re.search(...):

更新 刚发现Python重新匹配()有一个隐含的^锚点。
换句话说,它只匹配字符串的开头,
奇怪的是,与Java不同,它不要求它匹配整个字符串。在

但要注意的是,将连续的正、负两种预测组合起来,
与Stribnez的答案一样,如果不锚定到
,则可能会产生意外结果 什么。文本或BOS定位点^。在

对于一般用法,不要依赖于(或如果)在某些语言中
match()函数意味着一个BOS锚^(可能还有EOS$)。
一直把一个(或两个)放进去。这样就可以
也可以在search()中。并且可以移植到其他语言。在

要了解系列中lookahead的消极和积极影响,
使用这个复杂的独立表达式(?=.*\bfoo\b)(?!.*\bbar\b)

可以这样检查:

因为它是序列中的,所以两个断言必须相同地匹配
在字符串中的位置。在

如果两者在字符串中的位置相同,则否定断言
当它找到一个下游与它的内容不匹配的地方时就可以满足了。在

假设没有锚定的存在,这个离开是一个开口上游
(在搜索位置和示例中的bar文本之间)for
不希望存在的内容,仍将满足正/负
断言对。在

示例:
(?=.*\bfoo\b)(?!.*\bbar\b)
匹配
bar red foo

**  Grp 0 -  ( pos 1 , len 0 )  EMPTY 

b<here>ar red foo

这表明在位置1,两个断言都满足。在

结论:
1始终使用锚定,即使它们是隐含的。
2避免使用任何语言的match()函数,改用search()。在

结束更新


无论您使用积极还是消极的前瞻性,
如果不使用正确的语法,它就不能工作。在

看看这个(?!=.*\bfoo\b)

这意味着下一个字符不能是等号=后跟
贪心的字符数直到下一个foo。这是不允许的。在

因此,它将不匹配= ab foo,但它将匹配'=(这里)abfoo'。在

下一个问题是,如果你不给断言任何锚定的东西
它将使用凹凸移动位置到字符之间的位置
那就满足了。在

您要查找的“消极展望”更正如下
^(?!.*\bfoo\b)


供参考:

^{pr2}$

而且,它们可以在任何地方混合和嵌套。在

要检测字符串中是否存在单词,您需要一个正向前瞻

(?=.*\bfoo\b)

必须使用.*来启用搜索,而不仅仅是在字符串开头(re.match将搜索定位在字符串开头)。在

若要检查字符串中是否没有单词,请使用negative lookahead

^{pr2}$

所以,把它们结合起来:

re.match(r'(?=.*\bfoo\b)(?!.*\bbar\b)', input)

将在包含整词foo且不包含整词bar的字符串中查找匹配项。在

相关问题 更多 >