代码之家  ›  专栏  ›  技术社区  ›  Ricky Robinson

在Python中捕获重复组

  •  1
  • Ricky Robinson  · 技术社区  · 7 年前

    我想捕获 n 乘以重复自身的模式 n 次,带 n >= 0 . 我有如下字符串:

    a = 'x="2"'
    b = 'x="2,3", y="hello", z="true"'
    

    我想提取“x”及其值“2,3”,“y”及其值“hello”等。变量之间用逗号后跟空格分隔;值位于双引号内。

    我怎样才能用 re Python中的库?

    我天真地尝试了以下几点:

    match = re.search(r'^((?P<variable>[0-9a-zA-Z_-]+)="(?P<value>.*)"(?:,\s)?)*', b)
    

    如果我打印 match.groupdict() ,它将输出:

    {'variable': 'x', 'value': '2,3", y="hello", z="true'}
    
    3 回复  |  直到 7 年前
        1
  •  3
  •   glibdud    7 年前

    您得到的比预期的多的原因是您正在匹配(删除组命名):

    ".*"
    

    由于正则表达式在默认情况下使用贪婪匹配,所以只要它能够在 " 最后,即使中间的文本也包含 " . 您可以将其设置为非贪婪匹配:

    "(?P<value>.*?)"
    

    或贪婪地匹配非- " 字符:

    "(?P<value>[^"]*)"
    

    下一个问题是,您会发现这只匹配字符串中最后一次出现的模式。如果要获取所有未知数量的匹配项,则需要 re.findall() . 不幸地 findall() 不支持 groupdict . 它的表亲 re.finditer() 但是,返回具有以下方法的匹配对象:

    for match in re.finditer(r'(?P<variable>[0-9a-zA-Z_-]+)="(?P<value>[^"]*)"', b):
        print(match.groupdict())
    

    {'variable': 'x', 'value': '2,3'}
    {'variable': 'y', 'value': 'hello'}
    {'variable': 'z', 'value': 'true'}
    
        2
  •  1
  •   Shen Yudong    7 年前
    import re
    
    a = 'x="2"'
    b = 'x="2,3", y="hello", z="true"'
    
    p = '(\w+)=\"([^\"]*)\"'
    
    ms = re.findall(p, b)
    print ms
    ms = re.findall(p, a)
    print ms
    

    输出:

    D:\>python reg.py
    [('x', '2,3'), ('y', 'hello'), ('z', 'true')]
    [('x', '2')]
    
    D:\>
    
        3
  •  1
  •   user9158931 user9158931    7 年前

    你可以在一行中尝试积极的向后看

    import re
    pattern=r'(?<=((\w)=))"(.*?)"'
    string="""'x="2,3", y="hello", z="true"'"""
    
    print([(i.group(2),i.group(3)) for i in re.finditer(pattern,string)])
    

    输出:

    [('x', '2,3'), ('y', 'hello'), ('z', 'true')]