首页 > 解决方案 > 无法理解 re.findall() 行为

问题描述

我在理解re.findall. 从文档中引用:

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

基于此,我希望以下行

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

产生结果

[(c)]

但是,它会产生结果

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

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

标签: pythonregex

解决方案


这是因为有三个捕获组:

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']

推荐阅读