【问题标题】:Python regex, capture groups that are not specificPython 正则表达式,捕获不特定的组
【发布时间】:2018-04-16 11:28:12
【问题描述】:

考虑以下示例字符串:

abc1235abc53abcXX

123abc098YXabc

我想捕获发生在 abc 之间的组,

例如我应该得到以下组:

1235, 53, XX
123, 098YX

我正在尝试这个正则表达式,但不知何故它没有捕获中间文本:

(abc(.*?))+

我做错了什么?

编辑:我需要使用正则表达式来完成,没有字符串拆分,因为我需要对捕获的组应用更多规则。

【问题讨论】:

    标签: python regex


    【解决方案1】:

    re.findall() 使用特定正则表达式模式的方法:

    import re
    
    strings = ['abc1235abc53abcXX', '123abc098YXabc']
    pat = re.compile(r'(?:abc|^)(.+?)(?=abc|$)')    # prepared pattern
    
    for s in strings:
        items = pat.findall(s)
        print(items)
        # further processing
    

    输出:

    ['1235', '53', 'XX']
    ['123', '098YX']
    

    • (?:abc|^) - 未捕获的组以匹配 abc 子字符串或 字符串的开头 ^
    • (.+?) - 捕获组以尽可能少地匹配任何字符序列
    • (?=abc|$) - 前瞻肯定断言,确保前一个匹配项后跟 abc 序列或 字符串结尾 $

    【讨论】:

      【解决方案2】:

      使用re.split:

      import re
      
      s = 'abc1235abc53abcXX'
      
      re.split('abc', s)
      # ['', '1235', '53', 'XX']
      

      请注意,您会得到一个空字符串,表示第一个 'abc' 之前的匹配项。

      【讨论】:

      • 我猜,我把问题简化了太多,我不需要拆分它,我需要捕获组,然后再应用一个正则表达式
      【解决方案3】:

      尝试通过abc 拆分字符串,然后使用if 中的if 语句删除空结果,如下所示:

      [r for r in re.split('abc', s) if r]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-12
        • 1970-01-01
        • 2019-03-17
        • 2018-07-21
        • 2021-01-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多