无法理解re.findall()行为

时间:2019-08-29 15:49:05

标签: python regex

我在理解re.findall的行为时遇到了一些麻烦。从文档中引用:

  

以字符串列表形式返回字符串中所有不重复的模式匹配项。从左到右扫描该字符串,并以找到的顺序返回匹配项。如果该模式中存在一个或多个组,则返回一个组列表;否则,返回一个列表。如果模式包含多个组,则这将是一个元组列表。空匹配项包含在结果中。

基于此,我希望以下一行

re.findall(f"(a)|(b)|(c)","c")

产生结果

[(c)]

但是,它会产生结果

[('', '', 'c')]

我不明白为什么要包含两个空字符串,因为在任何地方都看不到空匹配。

1 个答案:

答案 0 :(得分:0)

这是因为有三个捕获组:

import re

print(re.findall(r"(a)|(b)|(c)","d"))
print(re.findall(f"(a)|(b)|(c)","c"))
print(re.findall(r"(?:a)|(?:b)|(?:c)","c"))
print(re.findall(f"(?:a)|(b)|(c)","c"))
print(re.findall(f"(?:a|b|c)","c"))
print(re.findall(r"a|b|c","c"))

输出

[]
[('', '', 'c')]
['c']
[('', 'c')]
['c']
['c']