2024-06-26 14:43:15 发布
网友
我想用python正则表达式检测一个单词是否在一个句子中。同时,希望能够否定它。在
import re re.match(r'(?=.*\bfoo\b)', 'bar red foo here')
这段代码可以工作,但是我不明白为什么我需要把.*放在那里。 也要否定它,我不知道该怎么做。 我试过:
.*
但它不起作用。 我的最终目标是这样组合它们:
re.match(r'(?=.*\bfoo\b)(?!=.*\bbar\b)', 'bar red foo here')
您需要.*,因为re.match()试图将模式与字符串的开头相匹配。如果要搜索整个字符串,请使用re.search()。在
re.match()
re.search()
正如你可以做if re.search(...):,你也可以做if not re.search(...):
if re.search(...):
if not re.search(...):
更新 刚发现Python重新匹配()有一个隐含的^锚点。 换句话说,它只匹配字符串的开头, 奇怪的是,与Java不同,它不要求它匹配整个字符串。在
^
但要注意的是,将连续的正、负两种预测组合起来, 与Stribnez的答案一样,如果不锚定到,则可能会产生意外结果 什么。文本或BOS定位点^。在
对于一般用法,不要依赖于(或如果)在某些语言中match()函数意味着一个BOS锚^(可能还有EOS$)。 一直把一个(或两个)放进去。这样就可以 也可以在search()中。并且可以移植到其他语言。在
$
要了解系列中lookahead的消极和积极影响, 使用这个复杂的独立表达式(?=.*\bfoo\b)(?!.*\bbar\b)
(?=.*\bfoo\b)(?!.*\bbar\b)
可以这样检查:
因为它是序列中的,所以两个断言必须相同地匹配 在字符串中的位置。在
如果两者在字符串中的位置相同,则否定断言 当它找到一个下游与它的内容不匹配的地方时就可以满足了。在
假设没有锚定的存在,这个离开是一个开口上游 (在搜索位置和示例中的bar文本之间)for 不希望存在的内容,仍将满足正/负 断言对。在
bar
示例:(?=.*\bfoo\b)(?!.*\bbar\b)匹配bar red foo
bar red foo
** Grp 0 - ( pos 1 , len 0 ) EMPTY b<here>ar red foo
这表明在位置1,两个断言都满足。在
结论: 1始终使用锚定,即使它们是隐含的。 2避免使用任何语言的match()函数,改用search()。在
结束更新
无论您使用积极还是消极的前瞻性, 如果不使用正确的语法,它就不能工作。在
看看这个(?!=.*\bfoo\b)
(?!=.*\bfoo\b)
这意味着下一个字符不能是等号=后跟 贪心的字符数直到下一个foo。这是不允许的。在
=
foo
因此,它将不匹配= ab foo,但它将匹配'=(这里)abfoo'。在
= ab foo
下一个问题是,如果你不给断言任何锚定的东西 它将使用凹凸移动位置到字符之间的位置 那就满足了。在
您要查找的“消极展望”更正如下^(?!.*\bfoo\b)
^(?!.*\bfoo\b)
供参考:
而且,它们可以在任何地方混合和嵌套。在
要检测字符串中是否存在单词,您需要一个正向前瞻:
(?=.*\bfoo\b)
必须使用.*来启用搜索,而不仅仅是在字符串开头(re.match将搜索定位在字符串开头)。在
re.match
若要检查字符串中是否没有单词,请使用negative lookahead:
所以,把它们结合起来:
re.match(r'(?=.*\bfoo\b)(?!.*\bbar\b)', input)
将在包含整词foo且不包含整词bar的字符串中查找匹配项。在
您需要
.*
,因为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
这表明在位置1,两个断言都满足。在
结论:
1始终使用锚定,即使它们是隐含的。
2避免使用任何语言的match()函数,改用search()。在
结束更新
无论您使用积极还是消极的前瞻性,
如果不使用正确的语法,它就不能工作。在
看看这个
(?!=.*\bfoo\b)
这意味着下一个字符不能是等号
=
后跟贪心的字符数直到下一个
foo
。这是不允许的。在因此,它将不匹配
= ab foo
,但它将匹配'=(这里)abfoo'。在下一个问题是,如果你不给断言任何锚定的东西
它将使用凹凸移动位置到字符之间的位置
那就满足了。在
您要查找的“消极展望”更正如下
^(?!.*\bfoo\b)
供参考:
^{pr2}$而且,它们可以在任何地方混合和嵌套。在
要检测字符串中是否存在单词,您需要一个正向前瞻:
必须使用
.*
来启用搜索,而不仅仅是在字符串开头(re.match
将搜索定位在字符串开头)。在若要检查字符串中是否没有单词,请使用negative lookahead:
^{pr2}$所以,把它们结合起来:
将在包含整词
foo
且不包含整词bar
的字符串中查找匹配项。在相关问题 更多 >
编程相关推荐