2015-12-01 1 views
0

Я была строка из команды из сиг переключателя:питон регулярное выражение mactch переключателя выходов

interface FastEthernet2/0/45 
switchport access vlan 703 
switchport mode access 
interface FastEthernet2/0/46 
switchport access vlan 703 
switchport mode access 
interface FastEthernet2/0/47 
switchport access vlan 703 
switchport mode access 
interface FastEthernet2/0/48 
switchport access vlan 311 
switchport mode access 
interface GigabitEthernet2/0/1 
interface GigabitEthernet2/0/2 
interface GigabitEthernet2/0/3 
interface GigabitEthernet2/0/4 

Я хотел бы использовать pyhon повторно, чтобы сократить их каждый интерфейс, как:

['interface FastEthernet2/0/45 switchport access vlan 703 switchport mode access', 
..ommited.., 'interface FastEthernet2/0/48 switchport access vlan 311 switchport mode access', 
..omitted.., 'interface GigabitEthernet2/0/3', 'interface GigabitEthernet2/0/4'] 

Я помню, что это можно сделать не-жадным, чтобы поймать «интерфейс» как точку остановки для каждого шаблона. К сожалению, это регулярное выражение: «(интерфейс. *?)» Получает только каждый «интерфейс», но номер порта и деталь. Я могу найти очевидный конечный символ, чтобы позволить re получить «интерфейс» и следующие строки.

Может быть, это очень легко, но я совершенно поражен там ...

ответ

1

Python не позволяет расщепление на пустом матч, так что вы должны написать регулярное выражение, чтобы соответствовать всем линиям каждому из интерфейсов вместо.

import re 
re.findall(r'^interface.*(?:\n[\t ]+.*)*', input, re.M) 

Регулярное выражение начинается соответствие с линий, начиная с ^interface.*, затем соответствовать новой строке, и по-прежнему соответствие, если есть один или несколько пробелов [\t ]+ в начале следующей строки.

Demo on regex101

Примите к сведению, как \n включен в начале повторения. Эта конструкция позволяет регулярному выражению соответствовать последней записи, если вход не заканчивается новой строкой.

0

Просто разделить в соответствии с символом новой строки, которая существует до того interface

re.split(r'\s*\n\s*(?=interface\b)', s) 

Пример:

>>> import re 
>>> s = '''interface FastEthernet2/0/45 
switchport access vlan 703 
switchport mode access 
interface FastEthernet2/0/46 
switchport access vlan 703 
switchport mode access 
interface FastEthernet2/0/47 
switchport access vlan 703 
switchport mode access 
interface FastEthernet2/0/48 
switchport access vlan 311 
switchport mode access 
interface GigabitEthernet2/0/1 
interface GigabitEthernet2/0/2 
interface GigabitEthernet2/0/3 
interface GigabitEthernet2/0/4''' 

>>> re.split(r'\s*\n\s*(?=interface\b)', s) 
['interface FastEthernet2/0/45\n switchport access vlan 703\n switchport mode access', 'interface FastEthernet2/0/46\n switchport access vlan 703\n switchport mode access', 'interface FastEthernet2/0/47\n switchport access vlan 703\n switchport mode access', 'interface FastEthernet2/0/48\n switchport access vlan 311\n switchport mode access', 'interface GigabitEthernet2/0/1', 'interface GigabitEthernet2/0/2', 'interface GigabitEthernet2/0/3', 'interface GigabitEthernet2/0/4'] 
0
>>> re.findall(r"(interface\s*FastEthernet\d+\/\d+\/\d+[^\n]+\n[^\n]+\n[^\n]*)", YOUR_STRING, re.S|re.I) 
['interface FastEthernet2/0/45\n switchport access vlan 703\n switchport mode access', 'interface FastEthernet2/0/46\n switchport access vlan 703\n switchport mode access', 'interface FastEthernet2/0/47\n switchport access vlan 703\n switchport mode access', 'interface FastEthernet2/0/48\n switchport access vlan 311\n switchport mode access'] 
Смежные вопросы