【问题标题】:Why does findall not return the whole match when matching with a group? [duplicate]为什么 findall 在与组匹配时不返回整个匹配项? [复制]
【发布时间】:2016-04-10 06:49:18
【问题描述】:

正如我所读到的,(dog|cat)food 将寻找dog foodcat food,但我无法用我的案例重现它。

>>> for m in re.findall('RA[a-zA-Z0-9]*',"RAJA45909"):
    print(m)


RAJA45909
>>> for m in re.findall('(ra|RA)[a-zA-Z0-9]*',"RAJA45909"):
    print(m)


RA
>>> 

谁能帮我理解这个。

【问题讨论】:

    标签: python regex


    【解决方案1】:

    您应该使用re.finditer 而不是re.findall,然后打印整个匹配组:

    >>> for m in re.finditer('(ra|RA)[a-zA-Z0-9]*',"RAJA45909"):
    ...     print(m.group())
    ... 
    RAJA45909
    

    findall 的文档说:

    如果模式中存在一个或多个组,则返回一个列表 团体;如果模式有多个,这将是一个元组列表 组。

    您的正则表达式只有一个组,因此结果是与该组匹配的文本列表。如果我们添加其他组,您会看到:

    >>> for m in re.findall('(ra|RA)([a-zA-Z0-9]*)',"RAJA45909"):
    ...     print(m)
    ... 
    ('RA', 'JA45909')
    

    所以findall 与组一起使用时匹配整个正则表达式,但只返回与组匹配的部分。而finditer 总是返回一个完整的匹配对象。

    【讨论】:

      【解决方案2】:

      你可以用这个

      print(re.findall('((?:ra|RA)[a-zA-Z0-9]*)',"RAJA45909"))
      

      Ideone Demo

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-23
        • 2013-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-19
        • 2018-06-12
        • 2021-05-01
        相关资源
        最近更新 更多