Преобразование группы захвата в именованную группу захвата - PullRequest
0 голосов
/ 13 июля 2020

Как бы я подошел к преобразованию простых групп захвата в именованные группы захвата, если бы я должен был предоставить имена в виде списка, я обычно программирую на python, но открыт для других языков, которые могут помочь в этом.

Basi c Пример:

Regex:

(\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"

Спасибо!

Ответы [ 2 ]

0 голосов
/ 13 июля 2020

Вы можете использовать следующее, хотя это будет довольно сложно, если у вас когда-либо будут вложенные круглые скобки:

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+)
0 голосов
/ 13 июля 2020

Вам нужно добавить 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)
...