Ant*_*hev 5 python regex regex-greedy
我尝试使用正则表达式来查找由重复的双字母形成的最大长度序列,例如AABB
string 中的xAAABBBBy
。
正如官方文档中所述:
、
'*'
、'+'
和'?'
量词都是贪婪的;它们匹配尽可能多的文本。
当我使用量词时{n,}
,我得到一个完整的子字符串,但+
仅返回部分:
import re
print(re.findall("((AA|BB){3,})", "xAAABBBBy"))
# [('AABBBB', 'BB')]
print(re.findall("((AA|BB)+)", "xAAABBBBy"))
# [('AA', 'AA'), ('BBBB', 'BB')]
Run Code Online (Sandbox Code Playgroud)
为什么{n,}
比 更贪婪+
?
量词{3,}
和+
都是贪婪的。
首先,让我们通过将内部组更改为非捕获组来稍微简化输出:
\nimport re\n\nprint(re.findall("((?:AA|BB){3,})", "xAAABBBBy"))\n# ['AABBBB']\nprint(re.findall("((?:AA|BB)+)", "xAAABBBBy"))\n# ['AA', 'BBBB']\n
Run Code Online (Sandbox Code Playgroud)\n第一个模式需要重复(出现的总数至少为 3 \xe2\x80\x93 让我们称此多重性 \xe2\x89\xa53),因此唯一可能的匹配从第二个开始A
:
\n\n\n
x
A
\xe2\x9f\xa8A
A
B
B
B
B
\xe2\x9f\xa9y
第二种模式仅需要重数 \xe2\x89\xa51。当从左到右扫描字符串时,第一个(最左边)可能的贪婪匹配由前两个A
s 形成。对于剩余的字符串ABBBBy
,第一个(最左边)可能的贪婪匹配是BBBB
。之后就y
只剩下无法匹配的了。
\n\n\n
x
\xe2\x9f\xa8A
A
\xe2A
\x9f\xa9B
B
B
B
\xe2\x9f\xa8 \xe2\x9f\xa9y