Python 中 re.search 函数的不同行为

问题描述 投票:0回答:1

我在正则表达式中遇到了搜索函数的不同行为,这让我认为模式中存在隐式锚点。是这样吗?

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

我已经研究过是否是这种情况,但我找不到任何解释。

python-3.x search python-regex
1个回答
0
投票

我不是正则表达式专家,所以我将使用简单的词语来描述内部发生的情况。

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)
© www.soinside.com 2019 - 2024. All rights reserved.