python - регулярное выражение, помещающее повторяющиеся шаблоны в одну группу - PullRequest
0 голосов
/ 03 апреля 2019

Я пытаюсь разобрать строку в регулярном выражении и там 99%.

моя тестовая строка

 1
  1234 1111 5555 88945
    172.255.255.255 from 172.255.255.255 (1.1.1.1)
      Origin IGP, localpref 300, valid, external, best
      rx pathid: 0, tx pathid: 0x0

мой текущий шаблон регулярного выражения:

(?P<as_path>(\d{4,10}\s){1,20})\s+(?P<peer_addr>\d{0,3}\.\d{0,3}\.\d{0,3}\.\d{0,3}).*\((?P<peer_rid>\d{0,3}\.\d{0,3}\.\d{0,3}\.\d{0,3})\)\s+.*localpref\s(?P<local_pref>\d+),\s(?P<attribs>\S+,\s{0,4})

я использую regex101 для тестирования и здесь есть ссылка на тест https://regex101.com/r/iGM8ye/1

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

, а во-вторых, в атрибутах, которые я хочу сопоставить со словами «действительный, внешний, лучший», в настоящее время мой шаблон соответствует только «действительный», я думал, добавив повторение внутри группысовпал бы со всеми тремя из них, но это не так.

Как мне добиться совпадения повторения «строка, строка, строка» (строка с запятой) в одну группу?

Спасибо

РЕДАКТИРОВАТЬ

Желаемый вывод

as_path : 1234 1111 5555 88945
peer_addr : 172.255.255.255
peer_rid : 1.1.1.1
local_pref : 300
attribs : valid, external, best 

attiribs также может быть только действительным, внешним или просто внешним, или другой записью в формате(stringcommaspace)

Ответы [ 3 ]

2 голосов
/ 03 апреля 2019

Попробуйте Regex: (?P<as_path>(?:\d{4,10}\s){1,20})\s+(?P<peer_addr>\d{0,3}\.\d{0,3}\.\d{0,3}\.\d{0,3}).*\((?P<peer_rid>\d{0,3}\.\d{0,3}\.\d{0,3}\.\d{0,3})\)\s+.*localpref\s(?P<local_pref>\d+),\s(?P<attribs>[\S]+,(?: [\S]+,?)*){0,4}

Демо

У регулярного выражения в вопросе была группа захвата (Группа 2) для (\d{4,10}\s). теперь она заменена на группу без захвата (?:\d{4,10}\s)

1 голос
/ 03 апреля 2019

Вы получаете эту отдельную группу, потому что вы повторяете группу захвата, где последняя итерация будет группой захвата, в этом случае 88945 Вместо этого вы можете сделать ее не захватывающей (?:

Для второгочасть, которую вы можете использовать чередование, чтобы точно соответствовать одному из вариантов (?:valid|external|best)

Ваш шаблон может выглядеть так:

(?P<as_path>(?:\d{4,10}\s){1,20})\s+(?P<peer_addr>\d{0,3}\.\d{0,3}\.\d{0,3}\.\d{0,3}).*\((?P<peer_rid>\d{0,3}\.\d{0,3}\.\d{0,3}\.\d{0,3})\)\s+.*localpref\s(?P<local_pref>\d+),\s(?P<attribs>(?:valid|external|best)(?:,\s{0,4}(?:valid|external|best))+)

regex101 demo

1 голос
/ 03 апреля 2019

См. Регулярное выражение в использовании здесь .

(?P<as_path>(?:\d{4,10}\s){1,20})\s+(?P<peer_addr>\d{0,3}(?:\.\d{0,3}){3}).*\((?P<peer_rid>\d{0,3}(?:\.\d{0,3}){3})\)\s+.*localpref\s(?P<local_pref>\d+),\s+(?P<attribs>\S+(?:,\s+\S+){2})
  1. Вы получали группу 2, потому что ваша группа as_path содержала группу.Я изменил это на группу без захвата.
  2. Я изменил attribs на \S+(?:,\s+\S+){2}
    • Это будет соответствовать любому непробельному символу один или несколько раз \S+, за которым следуетповторяется ровно дважды:
      • ,\s+\S+ символ запятой, после которого один или несколько раз ставится пробел, а затем один или несколько раз любой непробельный символ
  3. Я изменил peer_addr и peer_rid на \d{0,3}(?:\.\d{0,3}){3} вместо \d{0,3}\.\d{0,3}\.\d{0,3}\.\d{0,3}.Это предпочтение, но оно сокращает выражение.

Без этого последнего изменения вы можете использовать следующее регулярное выражение (в любом случае оно работает немного лучше (как видно здесь ):

(?P<as_path>(?:\d{4,10}\s){1,20})\s+(?P<peer_addr>\d{0,3}\.\d{0,3}\.\d{0,3}\.\d{0,3}).*\((?P<peer_rid>\d{0,3}\.\d{0,3}\.\d{0,3}\.\d{0,3})\)\s+.*localpref\s(?P<local_pref>\d+),\s+(?P<attribs>\S+(?:,\s+\S+){2})

Вы также можете улучшить производительность, используя более конкретные токены, как показано ниже (обратите внимание, я также добавил модификатор x, чтобы сделать его более разборчивым) и, как видно, здесь :

(?P<as_path>\d{4,10}(?:\s\d{4,10}){0,19})\s+
(?P<peer_addr>\d{0,3}\.\d{0,3}\.\d{0,3}\.\d{0,3})[^)]*
\((?P<peer_rid>\d{0,3}\.\d{0,3}\.\d{0,3}\.\d{0,3})\)\s+
.*localpref\s(?P<local_pref>\d+),\s+
(?P<attribs>\w+(?:,\s+\w+){2})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...