python - 为什么 re.findall ('(ab)+' , 'abab' ) 返回 ['ab' ]= 同时 re.findall ('(ab)+?' , 'abab' ) 返回 ['ab' , 'ab' ]?

标签 python regex

我的python版本是2.7.6

我知道 +?+ 的非贪婪版本。
这样 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' 作为贪婪搜索的 group1。< br/> 但是为什么我在执行 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 在这里如何工作?
为什么???

最佳答案

这里有一个微妙之处 - 在 Jerry 的回答中有所触及,但没有明确说明。

您期望 re.findall('(ab)+', 'abab') 告诉您关于两者 整个正则表达式的隐式“组 0”匹配,括号中的“第 1 组”。 它不是这样工作的。如果有捕获括号,findall 的列表包含捕获括号的组。观察:

>>> re.findall('(?:ab)+', 'abab') # no capture, reports group 0
['abab']
>>> re.findall('(ab)+', 'abab')   # one capture, reports _only_ group 1
['ab']
>>> re.findall('((ab)+)', 'abab') # two captures, reports both groups 1 and 2
[('abab', 'ab')]                  # (but still not group 0)

文档可以更清楚地说明这一点。它假定您了解“第 0 组”实际上不算作一个组。但这就是 RE 图书馆几十年来的工作方式。

关于python - 为什么 re.findall ('(ab)+' , 'abab' ) 返回 ['ab' ]= 同时 re.findall ('(ab)+?' , 'abab' ) 返回 ['ab' , 'ab' ]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29430909/

相关文章:

python - 使用 FastAPI 计算全局变量的请求数

python - Pandas - 比较 None 值

python - 检查方法是否已经在对象中?

用于捕获以逗号分隔的项目列表的 Python 正则表达式

regex - 如何根据它们的值将目录中的所有文件夹移动到子目录?

javascript - 正则表达式不适用于密码验证

python - 如何将数组划分为段,然后使用 python numpy 执行段的子段?

python - 如何访问实例变量隐藏的类变量?

regex - Spark SQL - 仅匹配数字的正则表达式

javascript - 将数字数组转换为合适的正则表达式