为什么正则表达式量词 {n,} 比 + (在 Python 中)更贪婪?

Ant*_*hev 5 python regex regex-greedy

我尝试使用正则表达式来查找由重复的双字母形成的最大长度序列,例如AABBstring 中的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,}比 更贪婪+

Lov*_*ure 5

量词{3,}+都是贪婪的。

\n

首先,让我们通过将内部组更改为非捕获组来稍微简化输出:

\n
import 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

x A\xe2\x9f\xa8 A A B B B B\xe2\x9f\xa9y

\n
\n

第二种模式仅需要重数 \xe2\x89\xa51。当从左到右扫描字符串时,第一个(最左边)可能的贪婪匹配由前两个As 形成。对于剩余的字符串ABBBBy,第一个(最左边)可能的贪婪匹配是BBBB。之后就y只剩下无法匹配的了。

\n
\n

x\xe2\x9f\xa8 A A\xe2 A\x9f\xa9 B B B B\xe2\x9f\xa8 \xe2\x9f\xa9y

\n
\n