使用Python CISCOCONFPARSE和regex选择接口列表

时间:2014-08-28 18:52:20

标签: python regex ciscoconfparse

我使用双循环选择所有接口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 CONFIG_PARSED.find_objects中的INT('^ interface GigabitEthernet [1-2] / 0 /')

感谢您的帮助

1 个答案:

答案 0 :(得分: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

FYI,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() 32次不同时间走完整个Cisco IOS配置非常慢。

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