【问题标题】:How to extract the value between the key using RegEx?如何使用 RegEx 提取键之间的值?
【发布时间】:2022-01-12 17:22:05
【问题描述】:

我有这样的文字:

"abababba"

我想将字符提取为a 之间的列表。 对于上面的文本,我期望输出如下:

['b', 'b', 'bb']

我用过:

re.split(r'^a(.*?)a$', data)

但它不起作用。

【问题讨论】:

    标签: python python-3.x regex split


    【解决方案1】:

    您可以使用 re.findall 以模式返回捕获组值:

    a([^\sa]+)(?=a)
    
    • a 匹配 a 字符
    • ([^\sa]+) 捕获组 1,重复匹配除 a 之外的任何字符(如果您不想匹配空格,则为 whitspace 字符)
    • (?=a) 正向前瞻,向右断言 a

    Regex demo

    import re
    
    pattern = r"a([^\sa]+)(?=a)"
    s = "abababba"
    
    print(re.findall(pattern, s))
    

    输出

    ['b', 'b', 'bb']
    

    【讨论】:

      【解决方案2】:

      您可以使用列表推导来实现此目的:

      s = "abababba"
      l = [x for x in s.split("a") if not x == ""]
      print(l)
      

      输出:

      ['b', 'b', 'bb']
      

      【讨论】:

        【解决方案3】:

        ^ 和 $ 将仅分别匹配行的开头和结尾。 在这种情况下,您将使用以下行获得所需的列表:

        re.split(r'a(.*?)a', data)[1:-1]
        

        【讨论】:

          【解决方案4】:

          为什么不使用正常的拆分:

          "abababba".split("a") --> ['', 'b', 'b', 'bb', '']
          

          并根据需要删除空白部分:

          # remove all empties:
          
          [*filter(None,"abababba".split("a"))] -> ['b', 'b', 'bb'] 
          

          # only leading/trailing empties (if any)
          
          "abababba".strip("a").split("a") --> ['b', 'b', 'bb'] 
          

          # only leading/trailing empties (assuming always enclosed in 'a')
          
          "abababba".split("a")[1:-1]  --> ['b', 'b', 'bb'] 
          

          如果你必须使用正则表达式,也许 findall() 会让你使用更简单的模式,同时覆盖所有边缘情况(忽略所有空):

          re.findall(r"[^a]+","abababba") --> ['b', 'b', 'bb']
          re.findall(r"[^a]+","abababb")  --> ['b', 'b', 'bb']
          re.findall(r"[^a]+","bababb")   --> ['b', 'b', 'bb']
          re.findall(r"[^a]+","babaabb")  --> ['b', 'b', 'bb']
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2022-01-12
            • 2022-01-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-07-16
            • 1970-01-01
            相关资源
            最近更新 更多