我使用一个双循环来使用高效工具CISCOCONFPARSE选择所有接口GigabitEthernet1 1/0/1至1/0/16和2/0/1至2/0/16 :下面是一个示例:
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个数字:
在CONFIG_PARSED.find_objects('^interface GigabitEthernet1-2/0/')
谢谢你的帮助
发布于 2014-08-29 11:25:33
你基本上有两个选择..。
选项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 objobj.ordinal_list返回一个代表接口的卡、槽和端口号的整数的python列表。例如,“GigabitEthernet2 2/0/11”的ordinal_list是[2, 0, 11]。您必须使用版本1.1.5 (或更高版本)并使用factory=True进行解析以获得ordinal_list。
不做这个
从性能角度看,您提供的示例确实很糟糕,因为find_objects()遍历整个Cisco配置,开始寻找提供的regex。如果不是很明显的话,用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)+'$')https://stackoverflow.com/questions/25555998
复制相似问题