我使用双循环选择所有接口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 /')
感谢您的帮助
答案 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)+'$')