【问题标题】:Python re.findall print all patternsPython re.findall 打印所有模式
【发布时间】:2013-07-02 07:04:38
【问题描述】:
>>> match = re.findall('a.*?a', 'a 1 a 2 a 3 a 4 a')
>>> match
['a 1 a', 'a 3 a']

如何打印出来

['a 1 a', 'a 2 a', 'a 3 a', 'a 4 a']

谢谢!

【问题讨论】:

    标签: python regex findall


    【解决方案1】:

    我认为使用积极的前瞻断言应该可以解决问题:

    >>> re.findall('(?=(a.*?a))', 'a 1 a 2 a 3 a 4 a')
    ['a 1 a', 'a 2 a', 'a 3 a', 'a 4 a']
    

    re.findall 返回正则表达式中的所有组 - 包括前瞻中的组。这是有效的,因为前瞻断言不消耗任何字符串。

    【讨论】:

    • 这是+1的方法
    【解决方案2】:
    r = re.compile('a.*?a') # as we use it multiple times
    matches = [r.match(s[i:]) for i in range(len(s))] # all matches, if found or not
    matches = [m.group(0) for m in matches if m] # matching string if match is not None
    print matches
    

    给予

    ['a 1 a', 'a 2 a', 'a 3 a', 'a 4 a']
    

    我不知道这是否是最好的解决方案,但在这里我测试每个到达字符串末尾的子字符串是否与给定的模式匹配。

    【讨论】:

      【解决方案3】:

      您可以使用允许重叠匹配的替代regex 模块:

      >>> regex.findall('a.*?a', 'a 1 a 2 a 3 a 4 a', overlapped = True)
      ['a 1 a', 'a 2 a', 'a 3 a', 'a 4 a']
      

      【讨论】:

      • 如果/当该模块替换默认的re 模块时会很好
      • @JonClements 是的!我会喜欢它。对于该模块提供的所有好处,它也得到了很好的支持。我发现了一个错误并报告给了模块开发人员。它在 24 小时内修复。
      • 也搜索了它,但从不知道有一个比“re”更好的“regex”模块
      猜你喜欢
      • 2012-01-11
      • 1970-01-01
      • 2014-09-21
      • 1970-01-01
      • 2015-02-16
      • 2014-06-21
      • 2014-11-03
      • 1970-01-01
      • 2022-11-18
      相关资源
      最近更新 更多