使用括号时为什么re.findalll和re.finditer的输出不同?

时间:2018-06-15 07:50:00

标签: python regex python-3.x findall

在Python 3.6中,为什么re.findall在re.finditer中返回以下示例中的不同项?

text = "He was carefully disguised but captured quickly by 10 caps."

print(re.findall(r"ca(p)", text))

for i in re.finditer(r"ca(p)", text):
    print(i)

findall返回[' p',' p'],而finditer返回两个" cap"。它只在我使用括号时发生!

1 个答案:

答案 0 :(得分:-1)

finditer返回一个匹配对象的可迭代对象,其中包含所有捕获的组,当您打印匹配的对象时,它返回包含整个匹配字符串的第一个匹配组。

如果您希望字符串与捕获的组匹配,则需要使用group()方法接受捕获的组的数量作为其参数。

for i in re.finditer(r"ca(p)", text):
    print(i.group(1))

另一方面,re.findall()返回列表中正则表达式中所有捕获组匹配的字符串。它大致相当于跟随finditer()代码:

[i for m in re.finditer(r"ca(p)", text) for i in m.groups()]