【问题标题】:Trouble understanding re.findall() behavior无法理解 re.findall() 行为
【发布时间】:2020-01-02 22:36:03
【问题描述】:

我无法理解re.findall 的行为。引用文档:

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

基于此,我希望以下行

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

产生结果

[(c)]

但是,它会产生结果

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

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

【问题讨论】:

  • 最后一行说明了一切——“如果模式中存在一个或多个组,则返回一个组列表;如果模式有多个组,这将是一个元组列表。空结果中包含匹配项。”因此,您的模式中总共有 3 个组,其中两个是空的。
  • 第一组和第二组 (a)(b) 不匹配,所以前两组得到一个空字符串,第三组得到 'c',因为它应该发生根据文档。
  • @ThierryLathuille 我认为只有在实际匹配的情况下才会返回一个空字符串,而不是在根本没有匹配的情况下,至少我是这样解释文档的。不过,您的解释对观察到的行为更有意义,所以谢谢:)

标签: python regex


【解决方案1】:

这是因为有三个捕获组:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-07
    • 2019-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-03
    相关资源
    最近更新 更多