我花了一些时间试图理解Python 3中的Regex术语,但我无法弄清楚(\D\d)+
在这里是如何工作的。
我知道\D
表示非数字字符,\d
表示数字字符,加号+
表示前一表达式的一个或多个重复。但是,当我尝试以下代码时,我无法绕过结果。
输入:
import re
text = "a1 b2 c3 d4e5f6"
regex = re.findall(r'(\D\d)+',text)
print(regex)
输出:
['a1', 'b2', 'c3', 'f6']
由于正则表达式包含一个加号,它不应该输出d4e5f6
,因为它们是一个非数字和数字字符序列?
答案 0 :(得分:1)
您不是直接使用\D\d
重复+
子模式,而是重复包含该子模式的捕获组(用括号表示)。最后的匹配确实是文本d4e5f6
,但它是捕获组的三个实例,每个实例都覆盖最后一个。在捕获组存在的情况下,Python re.findall()
的行为是它返回THEM(作为元组,如果有多个)而不是整体匹配。
Python 3.x中有一个较新的实验性regex
模块,它能够为单个捕获组返回多个匹配项,但我不确定它与findall()
的交互方式。您也可以将表达式编写为(?:\D\d)+
- (?:
启动非捕获组,这样findall()
将为您提供您期望的完整匹配。