Регулярное выражение на нескольких строках с \ n - PullRequest
1 голос
/ 14 июля 2020

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

import re

config = '''
Instance: evpn-a

VLAN ID: 123, MAC address: 00:05:86:71:05:f0
  Source: irb.0, Rank: 1, Status: Active
    State: <Local-MAC-Only Local-Gateway Remote-Adv-Allowed>
    IP address: 192.168.10.251

VLAN ID: 123, MAC address: 00:05:86:71:ab:f0
  Source: 20.1.1.2, Rank: 1, Status: Active
    State: <Remote-Gateway Local-Adv-Allowed Local-Adv-Done>
    IP address: 192.168.10.252
      L3 route: 192.168.10.252/32, L3 context: bridge-vrf (irb.0)

Instance: evpn-b

VLAN ID: 123, MAC address: 00:05:86:71:05:f0
  Source: irb.0, Rank: 1, Status: Active
    State: <Local-MAC-Only Local-Gateway Remote-Adv-Allowed>
    IP address: 192.168.10.251

VLAN ID: 123, MAC address: 00:05:86:71:ab:f0
  Source: 20.1.1.2, Rank: 1, Status: Active
    State: <Remote-Gateway Local-Adv-Allowed Local-Adv-Done>
    IP address: 192.168.10.252
      L3 route: 192.168.10.252/32, L3 context: bridge-vrf (irb.0)
'''


evpn_obj_list = re.compile(r'Instance:\s+(\S+)(.*?)(?:\S+|\Z)',re.S|re.M).findall(config)

evpn = evpn_obj_list

print(evpn)

Результат, который я получаю из вышеизложенного:

[('evpn-a', '\n\n'), ('evpn-b', '\n\n')]

1 Ответ

1 голос
/ 14 июля 2020

Вы можете использовать

rx = re.compile(r'^Instance:\s+(\S+)\s*(.*?)(?=\n\s*Instance:\s|\Z)', re.S|re.M)
evpn_obj_list = rx.findall(config)

См. демонстрацию регулярных выражений .

Подробности

  • ^ - начало строки
  • Instance: - строка
  • \s+ - 1+ пробелов
  • (\S+) - Группа 1: любой один или несколько не- пробельные символы
  • \s* - 0+ пробелов
  • (.*?) - Группа 2: любые 0 или более символов, как можно меньше
  • (?=\n\s*Instance:\s|\Z) - положительный результат просмотр вперед, требующий новой строки, 0+ пробелов, Instance:, пробела ИЛИ конца файла сразу справа от текущего местоположения.

См. Python демо уступая

[('evpn-a', 'VLAN ID: 123, MAC address: 00:05:86:71:05:f0\n  Source: irb.0, Rank: 1, Status: Active\n    State: <Local-MAC-Only Local-Gateway Remote-Adv-Allowed>\n    IP address: 192.168.10.251\n\nVLAN ID: 123, MAC address: 00:05:86:71:ab:f0\n  Source: 20.1.1.2, Rank: 1, Status: Active\n    State: <Remote-Gateway Local-Adv-Allowed Local-Adv-Done>\n    IP address: 192.168.10.252\n      L3 route: 192.168.10.252/32, L3 context: bridge-vrf (irb.0)'), ('evpn-b', 'VLAN ID: 123, MAC address: 00:05:86:71:05:f0\n  Source: irb.0, Rank: 1, Status: Active\n    State: <Local-MAC-Only Local-Gateway Remote-Adv-Allowed>\n    IP address: 192.168.10.251\n\nVLAN ID: 123, MAC address: 00:05:86:71:ab:f0\n  Source: 20.1.1.2, Rank: 1, Status: Active\n    State: <Remote-Gateway Local-Adv-Allowed Local-Adv-Done>\n    IP address: 192.168.10.252\n      L3 route: 192.168.10.252/32, L3 context: bridge-vrf (irb.0)\n')]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...