#python-3.x #regex #regex-group
#python-3.x #регулярное выражение #регулярное выражение-группа
Вопрос:
Я нашел все сообщения, которые я смог найти на этом сайте, которые помогают выбирать IP-адреса в заданной строке, и тот, который работает абсолютно лучше для меня, я изменил его, чтобы также получить информацию о подсети / xx в конце. Например, 192.168.1.1/24
Что НЕ работает, так это то, что мне нужно, чтобы каждое из совпадений IP было помещено в группу… но каждый найденный мной пример делает их группами без захвата с помощью ?: и это бесполезно для меня, потому что я не могу начать собирать результаты для добавления в электронную таблицу — я использую Python.
Итак:
(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?/d{1,2})
выполнить с этой строкой:
blah blah 16.13.129.128/25 blah blah 18.83.130.0/24 blah blah 18.18.141.0/24 blah blah 10.17.14.0/24
действительно соответствует каждому IP :
16.13.129.128/25
18.83.130.0/24
18.18.141.0/24
10.17.14.0/24
Но я не могу ссылаться на каждый IP как на Group0, Group1, Group2 и т. Д. Для каждого совпадения. Я действительно не понимаю, что ?: делает (помимо того, что делает его группой без захвата) — но когда я удаляю все ?: думая, что они превратятся в группы захвата — абсолютно убивает регулярное выражение, и оно больше не находит IP-адреса. Я использовал несколько сайтов отладки регулярных выражений для подтверждения этих выводов, но я не знаю, почему он полностью ломается
при простом отбрасывании?:
Кто-нибудь знает, как настроить одно и то же регулярное выражение, чтобы каждый IP-адрес мог быть назначен группе захвата, например:
Group0: 16.13.129.128/25
Group1: 18.83.130.0/24
Group2: 18.18.141.0/24
Group3: 10.17.14.0/24
Комментарии:
1. Вы не понимаете, что означает термин «группы» в регулярных выражениях. Когда ваше регулярное выражение соответствует IP-адресу, а в строке несколько IP-адресов, каждый из них не является группой, это совпадение . Группы регулярных выражений не имеют ничего общего с тем, что вы хотите сделать, поэтому возиться с ними бессмысленно. Вы хотите иметь доступ к каждому совпадению, то есть к каждому IP-адресу в вашей строке. Так что забудьте о группах на мгновение.
Ответ №1:
Почему? Группы захвата называют фрагменты одного совпадения, так что это не то, что вам нужно. Просто используйте findall
и помещайте их в список, который вы можете перечислять или ссылаться по индексу:
import re
ipr = re.compile(r'(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?/d{1,2})')
s = 'blah blah 16.13.129.128/25 blah blah 18.83.130.0/24 blah blah 18.18.141.0/24 blah blah 10.17.14.0/24'
ips = ipr.findall(s)
for i,ip in enumerate(ips):
print(f'ips[{i}] = {ip}')
Вывод:
ips[0] = 16.13.129.128/25
ips[1] = 18.83.130.0/24
ips[2] = 18.18.141.0/24
ips[3] = 10.17.14.0/24