Выберите список интерфейсов с помощью Python CISCOCONFPARSE и regex
Я использую двойной цикл для выбора всех интерфейсов GigabitEthernet1/0/1 до 1/0/16 и 2/0/1 до 2/0/16 с помощью эффективного инструмента CISCOCONFPARSE: вот пример, который работает:
CONFIG_PARSED = CiscoConfParse(CONFIG)
for i in range(1,3):
for j in range(1,17):
INT = CONFIG_PARSED.find_objects('^interface GigabitEthernet'+str(i)+'/0/'+str(j)+'$')
Вопрос: есть ли способ сделать то же самое, используя простой цикл с регулярным выражением, такой как мой неправильный пример ниже?
for INT in CONFIG_PARSED.find_objects('^interface GigabitEthernet[1-2]/0/[1-16]$')
Этот другой пример ниже является допустимым регулярным выражением, но не позволяет выбирать от 1 до 16 чисел:
для INT в CONFIG_PARSED.find_objects('^interface GigabitEthernet[1-2]/0/')
спасибо за любую помощь
1 ответ
У вас по сути есть два варианта...
ВАРИАНТ A: Анализируйте номера портов самостоятельно, используя стабильный и поддерживаемый код CiscoConfParse...
import re
from ciscoconfparse import CiscoConfParse
CONFIG_PARSED = CiscoConfParse(CONFIG)
intf_rgx = re.compile(r'interface GigabitEthernet(\d+)\/(\d+)\/(\d+)$')
for obj in CONFIG_PARSED.find_objects('^interface GigabitEthernet'):
mm = intf_rgx.search(obj.text))
card = int(mm.group(1))
port = int(mm.group(3))
if card>2:
continue
if port>16:
continue
## Do something here with obj
ВАРИАНТ Б: Разбор номера порта разгрузки для парсера номера порта CiscoConfParse (начиная с версии 1.1.5)...
import re
from ciscoconfparse import CiscoConfParse
CONFIG_PARSED = CiscoConfParse(CONFIG, factory=True)
for obj in CONFIG_PARSED.find_objects('^interface GigabitEthernet'):
card = obj.ordinal_list[0]
port = obj.ordinal_list[-1]
if card>2:
continue
if port>16:
continue
## Do something here with obj
FYI, obj.ordinal_list
возвращает список целых чисел python, представляющих карту, слот и номер порта интерфейса. Например ordinal_list
для "GigabitEthernet2/0/11" есть [2, 0, 11]
, Вы должны использовать версию 1.1.5 (или выше) и проанализировать с factory=True
получить ordinal_list
,
НЕ ДЕЛАЙТЕ ЭТОГО:
Приведенный вами пример действительно плох с точки зрения производительности, потому что find_objects()
обходит всю конфигурацию Cisco IOS, начинает заканчивать поиск предоставленного регулярного выражения. В случае, если это не очевидно, обходя всю конфигурацию Cisco IOS 32 разных раза с find_objects()
очень медленно
CONFIG_PARSED = CiscoConfParse(CONFIG)
for i in range(1,3):
for j in range(1,17):
INT = CONFIG_PARSED.find_objects('^interface GigabitEthernet'+str(i)+'/0/'+str(j)+'$')