非贪婪在Python正则表达式(Non-greedy in Python Regex)

2019-10-23 18:48发布

我试着去了解在python的非贪婪正则表达式,但我不明白,为什么下面的例子有这样的结果:

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

我认为这将是“B”第一和“AB”的第二位。 任何人都可以解释一下吗?

Answer 1:

这是因为匹配你所要求的比赛之后 。 如果你试图遵循怎样的匹配a??b左恰巧正确的你会看到这样的内容:

  • 尝试0 ab VS aaab :不匹配( b != a
  • 尝试1 ab VS aaab :不匹配( ab != aa
  • 尝试0 ab VS aab :不匹配( b != a )(匹配位置由一个向右移动)
  • 尝试1 ab VS aab :不匹配( ab != aa
  • 尝试0 ab VS ab :不匹配( b != a )(匹配位置由一个向右移动)
  • 尝试1 ab VS ab比赛ab == ab

同样,对于*?

事实是,在search函数返回最左边的匹配。 使用??*? 只改变行为更倾向于最短最左边的比赛,但它不会返回开始于一个已经找到匹配的右较短的比赛。

还要注意的是, re模块不会返回重叠的匹配,所以即使使用findallfinditer你将无法找到你正在寻找的两场比赛。



Answer 2:

它因为如此??懒惰? 是greedy.and惰性限定符将匹配零个或一个(左令牌),零,如果仍然允许整体图案match.for例以下所有意愿返回一个空字符串:

>>> 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它会返回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'

而关于第二部分你有没有贪婪正则表达式,其结果是非常obvious.It将匹配任何数量的a ,然后b

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


Answer 3:

解释用于图案- /a??b/

a?? 匹配的字符a字面(区分大小写),然后,量词?? 装置之间零和一周时间,尽可能少的次数尽可能,扩大视需要[懒惰],然后字符b应该匹配,逐字(区分大小写)

所以它会最后一场比赛'ab'给定的字符串中的字符'aaab'

和模式- /a*?b/

a*? 匹配字符'a'从字面上(区分大小写)在这里,量词*? 零和无限时间之间是指,如几次尽可能根据需要扩大[懒]然后字符b应该匹配,逐字(区分大小写)。

所以它将匹配'aaab'作为一个整体'aaab'



文章来源: Non-greedy in Python Regex