Python正则表达式中的非贪婪

Python正则表达式中的非贪婪,python,regex,non-greedy,Python,Regex,Non Greedy,我试图理解python中的非贪婪正则表达式,但我不明白为什么以下示例会有这样的结果: print(re.search('a??b','aaab').group()) ab print(re.search('a*?b','aaab').group()) aaab 我以为第一个是b,第二个是ab。 有人能解释一下吗?发生这种情况是因为你要求的比赛是在赛后进行的。如果您尝试按照从左到右的方式匹配a??b,您将看到如下内容: 尝试0aplusbvsaaab:不匹配(b!=a) 尝试1aplusbvs

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

print(re.search('a??b','aaab').group())
ab
print(re.search('a*?b','aaab').group())
aaab
我以为第一个是b,第二个是ab。
有人能解释一下吗?

发生这种情况是因为你要求的比赛是在赛后进行的。如果您尝试按照从左到右的方式匹配
a??b
,您将看到如下内容:

  • 尝试0
    a
    plus
    b
    vs
    aaab
    :不匹配(
    b!=a
  • 尝试1
    a
    plus
    b
    vs
    aaab
    :不匹配(
    ab!=aa
  • 尝试0
    a
    plus
    b
    vs
    aab
    :不匹配(
    b!=a
    )(匹配位置向右移动一个)
  • 尝试1
    a
    plus
    b
    vs
    aab
    :不匹配(
    ab!=aa
  • 尝试0
    a
    plus
    b
    vs
    ab
    :不匹配(
    b!=a
    )(匹配位置向右移动1)
  • 尝试1
    a
    plus
    b
    vs
    ab
    match
    ab==ab
类似于
*?

事实上,
search
函数返回最左边的匹配项。使用
*?
只会更改行为以选择最左边的最短匹配,但不会返回从已找到匹配的右侧开始的较短匹配


还请注意,
re
模块不会返回重叠的匹配,因此即使使用
findall
finditer
您也无法找到您要查找的两个匹配项。

因为
是贪婪的。
而惰性量词将匹配0或1(其左标记),如果仍允许整体模式匹配,则为零。例如,以下所有内容都将返回空字符串:

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

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

>>> print(re.search('a??','aaaa').group())
正则表达式
a??b
将匹配
ab
b

>>> print(re.search('a??b','aaab').group())
ab
>>> print(re.search('a??b','aacb').group())
b
如果它不允许整体模式匹配,并且没有任何
b
它将返回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'

模式说明-
/a??b/

a???
按字面意思匹配字符
a
(区分大小写),然后匹配量词
??
表示在0到1次之间,尽可能少的次数,根据需要进行扩展[lazy],然后字符
b
应按字面意思匹配(区分大小写)

因此,它将匹配给定字符串中最后一个
'ab'
字符
'aaab'

对于模式-
/a*?b/

a*?
逐字匹配字符
'a'
(区分大小写) 这里的量词
*?
表示在零次和无限次之间,尽可能少的次数,根据需要展开[lazy],然后字符
b
应该匹配,字面上(区分大小写)


因此,它将在
'aaab'

中作为一个整体匹配
'aaab'
。原因是正则表达式引擎从左到右解析字符串,并在最左边的位置返回第一个可能的匹配。事实上,使用非贪婪量词不会改变任何事情。
print(re.search('a*?b','aaab').group())
aaab