【发布时间】:2020-01-02 22:36:03
【问题描述】:
我无法理解re.findall 的行为。引用文档:
返回字符串中所有不重叠的模式匹配,作为字符串列表。从左到右扫描字符串,并按找到的顺序返回匹配项。如果模式中存在一个或多个组,则返回组列表;如果模式有多个组,这将是一个元组列表。结果中包含空匹配项。
基于此,我希望以下行
re.findall(f"(a)|(b)|(c)","c")
产生结果
[(c)]
但是,它会产生结果
[('', '', 'c')]
我不明白为什么要包含两个空字符串,因为我在任何地方都看不到空匹配项。
【问题讨论】:
-
最后一行说明了一切——“如果模式中存在一个或多个组,则返回一个组列表;如果模式有多个组,这将是一个元组列表。空结果中包含匹配项。”因此,您的模式中总共有 3 个组,其中两个是空的。
-
第一组和第二组
(a)和(b)不匹配,所以前两组得到一个空字符串,第三组得到'c',因为它应该发生根据文档。 -
@ThierryLathuille 我认为只有在实际匹配的情况下才会返回一个空字符串,而不是在根本没有匹配的情况下,至少我是这样解释文档的。不过,您的解释对观察到的行为更有意义,所以谢谢:)