首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >选择一个与和regex接口的列表

选择一个与和regex接口的列表
EN

Stack Overflow用户
提问于 2014-08-28 18:52:19
回答 1查看 1.9K关注 0票数 1

我使用一个双循环来使用高效工具CISCOCONFPARSE选择所有接口GigabitEthernet1 1/0/1至1/0/16和2/0/1至2/0/16 :下面是一个示例:

代码语言:javascript
复制
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)+'$')

问:是否有一种方法可以使用带有正则表达式的简单循环来实现相同的操作,如下面的不正确示例?

代码语言:javascript
复制
for INT in CONFIG_PARSED.find_objects('^interface GigabitEthernet[1-2]/0/[1-16]$')

下面的另一个示例是一个有效的正则表达式,但不允许选择1到16个数字:

在CONFIG_PARSED.find_objects('^interface GigabitEthernet1-2/0/')

谢谢你的帮助

EN

回答 1

Stack Overflow用户

发布于 2014-08-29 11:25:33

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

选项A:自己解析端口号,使用稳定和支持的CiscoConfParse代码.

代码语言:javascript
复制
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)端口号解析器.

代码语言:javascript
复制
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 2/0/11”的ordinal_list[2, 0, 11]。您必须使用版本1.1.5 (或更高版本)并使用factory=True进行解析以获得ordinal_list

不做这个

从性能角度看,您提供的示例确实很糟糕,因为find_objects()遍历整个Cisco配置,开始寻找提供的regex。如果不是很明显的话,用find_objects()执行整个Cisco IOS配置32次是非常慢的。

代码语言:javascript
复制
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)+'$')
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25555998

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档