我花了一些时间试图理解 Python 3 中的正则表达式术语,但我无法弄清楚 (\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 因为它们是非数字和数字字符的序列吗?
请您参考如下方法:
您不是直接用 + 重复 \D\d 子模式,您是在重复一个捕获组(用括号表示) 包含该子模式。最终的匹配确实是文本 d4e5f6,但它是作为捕获组的三个实例进行的,每个实例都会覆盖最后一个。在存在捕获组的情况下,Python 的 re.findall() 的行为是它返回 THEM(作为一个元组,如果有多个)而不是整体匹配。
Python 3.x 中有一个较新的实验性 regex 模块,它能够为单个捕获组返回多个匹配项,尽管我不确定它如何与 交互查找所有()。您还可以将表达式写成 (?:\D\d)+ - (?: 开始一个非捕获组,所以 findall() 将为您提供您所期望的整个匹配项。
