Python 正则表达式中的非贪婪

Non-greedy in Python Regex

我试图理解 python 中的非贪婪正则表达式,但我不明白为什么以下示例会出现此结果:

print(re.search('a??b','aaab').group())
ab
print(re.search('a*?b','aaab').group())
aaab

我认为第一个是 'b',第二个是 'ab'。 谁能解释一下?

发生这种情况是因为您要求的匹配匹配之后。如果您尝试从左到右查看 a??b 的匹配方式,您会看到类似这样的内容:

  • 尝试 0 ab vs aaab:不匹配 (b != a)
  • 尝试 1 a 加上 b vs aaab:不匹配 (ab != aa)
  • Try 0 a plus b vs aab: no match (b != a) (匹配位置向右移动一位)
  • 尝试 1 ab vs aab:不匹配 (ab != aa)
  • Try 0 a plus b vs ab: no match (b != a) (匹配位置向右移动一位)
  • 尝试 1 ab vs ab匹配 (ab == ab)

*? 类似。

事实是 search 函数 return 是 最左边的 匹配项。使用 ??*? 只会改变行为以更喜欢 最短的最左边 匹配,但它会 而不是 return 从已找到的匹配项右侧开始的较短匹配项。

另请注意,re 模块不会 return 重叠匹配项,因此即使使用 findallfinditer 您也无法找到这两个匹配项你在找

因为 ??lazy? 是 greedy.and 惰性量词将匹配零或一(它的左标记),如果仍然匹配则为零允许整体模式 match.for 例如以下所有将 returns 一个空字符串:

>>> print(re.search('a??','a').group())

>>> print(re.search('a??','aa').group())

>>> print(re.search('a??','aaaa').group())

并且正则表达式 a??b 将匹配 abb :

>>> print(re.search('a??b','aaab').group())
ab
>>> print(re.search('a??b','aacb').group())
b

如果它不允许整体模式匹配并且没有任何 b 它将 return None :

>>> print(re.search('a??b','aac').group())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'group'

关于第二部分,你有一个 none-greedy 正则表达式,结果非常 obvious.It 将匹配任意数量的 a 然后 b:

print(re.search('a*?b','aaab').group())
aaab

模式说明 - /a??b/

a??字面上匹配字符a(区分大小写),然后是量词 ??表示Between zero and one time,次数越少越好,按需扩展[懒惰],那么字符b应该匹配,字面意思(区分大小写)

所以它将匹配给定字符串中的最后 'ab' 个字符 'aaab'

以及模式 - /a*?b/

a*? 按字面匹配字符 'a' (区分大小写) 这里量词 *? 表示介于零和无限次之间,尽可能少,根据需要扩展 [lazy] 然后字符 b 应该匹配,字面意思(区分大小写)。

所以它会在'aaab'

中作为一个整体匹配'aaab'