使用Python CISCOCONFPARSE和正则表达式选择接口列表

1 投票
1 回答
2069 浏览
提问于 2025-04-18 18:53

我使用了一个双重循环来选择所有接口,从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的数字:

for INT in CONFIG_PARSED.find_objects('^interface GigabitEthernet[1-2]/0/')

感谢任何帮助

1 个回答

0

你基本上有两个选择...

选项 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

选项 B: 将端口号解析的工作交给 CiscoConfParse 的 alpha 版本(截至 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

顺便说一下,obj.ordinal_list 会返回一个包含整数的 Python 列表,这些整数代表接口的卡片、插槽和端口号。例如,"GigabitEthernet2/0/11" 的 ordinal_list[2, 0, 11]。你必须使用 1.1.5 版本(或更高版本),并且在解析时设置 factory=True 才能得到 ordinal_list


不要这样做:

你提供的例子在性能上真的很糟糕,因为 find_objects() 会遍历整个 Cisco IOS 配置,从头到尾寻找提供的正则表达式。显而易见的是,使用 find_objects() 遍历整个 Cisco IOS 配置 32 次是非常慢的。

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)+'$')

撰写回答