我在正则表达式中遇到了搜索函数的不同行为,这让我认为模式中存在隐式锚点。是这样吗?
<code>
text = "bowl"
print(re.search(r"b|bowl", text)) # first alteration in this pattern works
print(re.search(r"o|bowl", text)) # but first alteration won't work here
print(re.search(r"w|bowl", text)) # nor here
print(re.search(r"l|bowl", text)) # nor here
print(re.search(r"bo|bowl", text)) # first alteration in this pattern works
print(re.search(r"bow|bowl", text)) # first alteration in this pattern works
</code>
<br />
输出
<re.Match object; span=(0, 1), match='b'>
<re.Match object; span=(0, 4), match='bowl'>
<re.Match object; span=(0, 4), match='bowl'>
<re.Match object; span=(0, 4), match='bowl'>
<re.Match object; span=(0, 2), match='bo'>
<re.Match object; span=(0, 3), match='bow'>
我已经研究过是否是这种情况,但我找不到任何解释。
我不是正则表达式专家,所以我将使用简单的词语来描述内部发生的情况。
search
从左到右工作,|
模式也是如此。此外 search
与 match
不同,它向前移动以尝试在字符串中找到模式,而不仅仅是在开始处。
拿这个:
re.search(r"o|bowl", text)
因此,如果测试
o
模式,由于匹配器位于输入字符串的 b
字符上,因此它不匹配,并且代码会尝试第二个模式。如果失败,它将跳到下一个字符(因为所有匹配可能性都已用尽)并会匹配 o
,但由于它匹配,因此不会发生:bowl
字符被消耗。
如果你尝试:
re.search("o|bar", text)
然后
o
将被匹配。
请注意,它不是特定于 python 的。这就是正确的正则表达式引擎的工作原理。
如果你想要替代行为,你可以写:
re.search("o", text) or re.search("bar", text)