我在理解re.findall
的行为时遇到了一些麻烦。从文档中引用:
以字符串列表形式返回字符串中所有不重复的模式匹配项。从左到右扫描该字符串,并以找到的顺序返回匹配项。如果该模式中存在一个或多个组,则返回一个组列表;否则,返回一个列表。如果模式包含多个组,则这将是一个元组列表。空匹配项包含在结果中。
基于此,我希望以下一行
re.findall(f"(a)|(b)|(c)","c")
产生结果
[(c)]
但是,它会产生结果
[('', '', 'c')]
我不明白为什么要包含两个空字符串,因为在任何地方都看不到空匹配。
答案 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']