我的Python版本是2.7.6
为什么re.findall('(ab)+','abab')返回['ab'] =与此同时re.findall('(ab)+?','abab')返回['ab','ab' ]?
我知道+?
是+
的非贪婪版本。
,以便re.findall('(ab)+?', 'abab')
尽可能少地匹配ab
。
结果['ab', 'ab']
因此是有意义的。
但是当谈到贪婪版本匹配re.findall('(ab)+', 'abab')
时,它让我困惑。
我认为贪婪的版本应该尽可能匹配ab
。
因此我得到['abab']
。
但我得到了['ab']
!
在re.findall()的帮助信息,它说:
Return a list of all non-overlapping matches in the string.
If one or more groups are present in the pattern, return a
list of groups; this will be a list of tuples if the pattern
has more than one group.
Empty matches are included in the result.
这里我有两个组,为整个RE默认group0
,我指定(ab)
为group1
。
所以我做了如下调查:
In [21]: ng = re.search('(ab)+?', 'abab')
In [22]: g = re.search('(ab)+', 'abab')
In [23]: ng.group(0)
Out[23]: 'ab'
In [24]: ng.group(1)
Out[24]: 'ab'
In [25]: g.group(0)
Out[25]: 'abab'
In [26]: g.group(1)
Out[26]: 'ab'
这是毋庸置疑的,re
模块将匹配'abab'
为GROUP0和'ab'
作为组1的贪婪搜索。
但是为什么我在findall()
操作时得到了['ab']
而不是['abab', 'ab']
?
因为'abab'
包含ab
所以它们重叠,并且findall()
只返回在这种情况下的最后一场比赛?
带着这样的疑问,我做了如下试验:
In [30]: g = re.findall('[A-z](ab)+', 'ababdab')
In [31]: g
Out[31]: ['ab', 'ab']
In [32]: dg = re.search('[A-z](ab)+', 'ababdab')
In [33]: dg.groups()
Out[33]: ('ab',)
In [34]: dg.group()
Out[34]: 'bab'
现在,我现在是完全出我的脑海。
findall如何在这里工作?
为什么?
**警告:不要在正则表达式中使用范围'[Az]'**它符合所有的ASCII字母,但它也匹配恰好位于'Z'和'a之间的几个标点符号'数字。 – 2015-04-03 12:33:56