- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的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版本是2.7.6 我知道 +? 是 + 的非贪婪版本。 这样 re.findall('(ab)+?', 'abab') 将匹配尽可能少的 ab。 结果 ['ab', 'ab'] 因此有
我搜索了很多答案来匹配 ABAB 模式 匹配任意字符类型的 1212 或 2323,已阅读 this too 但我发现匹配 ABAB 模式的模式不起作用,它也匹配 4444 我尝试找出匹配以下主题的模
有谁知道为什么使用 TS 并配置为生成 ES5 代码的 create-react-app 项目无法在 IE11 上工作,因为“abab”包中的“atob”未编译为符合 es5 的代码: module.
我是一名优秀的程序员,十分优秀!