【问题标题】:Convert capture group to named capture group将捕获组转换为命名捕获组
【发布时间】:2023-04-03 13:39:01
【问题描述】:

我将如何将简单的捕获组转换为命名的捕获组,如果我将名称作为列表提供,我通常使用 python 编程,但对其他可能有助于实现此目的的语言开放。

基本示例:

正则表达式:

(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s(\w+)\s(\w+)\s(\d+)

姓名:

["ip","name","proto","http_status_code"]

最终结果正则表达式:

(?<ip>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s(?<name>\w+)\s(?<proto>\w+)\s(?<http_status_code>\d+)

regex_data_to_test:

"172.16.1.1 bob tcp 200"

谢谢!

【问题讨论】:

    标签: python python-3.x regex regex-group


    【解决方案1】:

    您可以使用以下内容,但如果您有嵌套括号,这将变得非常棘手:

    reg = r"(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s(\w+)\s(\w+)\s(\d+)"
    groupNames = ["ip","name", "proto", "http_status_code"]
    
    splitReg = [a for a in reg.split("(") if a] # skip empty groups
    if len(groupNames) == len(splitReg):
        newReg = ''.join([("(?P<" + name + ">" + val) 
            for name, val in zip(groupNames, splitReg)])
        print(newReg)
    

    输出:

    (?P<ip>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s(?P<name>\w+)\s(?P<proto>\w+)\s(?P<http_status_code>\d+)
    

    【讨论】:

      【解决方案2】:

      您需要在每个组中添加P,即:

      (?P<ip>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s
      (?P<name>\w+)\s
      (?P<proto>\w+)\s
      (?P<http_status_code>\d+)
      

      Python 这可能是

      import re
      
      rx = re.compile(r'(?P<ip>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s(?P<name>\w+)\s(?P<proto>\w+)\s(?P<http_status_code>\d+)')
      
      string = "172.16.1.1 bob tcp 200"
      
      for m in rx.finditer(string):
          print(m.groupdict())
      

      产量

      {'ip': '172.16.1.1', 'name': 'bob', 'proto': 'tcp', 'http_status_code': '200'}
      

      regex101.com 上查看您的表情演示。


      请注意,如果您始终使用这种格式,则可以轻松拆分和解包:
      string = "172.16.1.1 bob tcp 200"
      ip, name, proto, status = string.split()
      
      print(ip)
      

      【讨论】:

      • 感谢 Jan,我知道了如何在 python 中创建常规命名捕获组,抱歉忘记添加“P”,因为我在使用 PCRE 之前哈哈。
      • 我想正确的问题是如何将这些名称映射到捕获组中,而不是手动进入并添加它们。
      猜你喜欢
      • 2014-06-26
      • 1970-01-01
      • 2014-09-11
      • 2015-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多