我试图从CDP中选择缩短的Cisco接口名称,如下所示,以及使用带RegEx的Python显示mac地址表输出。
我已经尝试过RegEx测试器,并且Gig \ s?\ d +(/ \ d +)*看起来很棒,但是在我的Python代码中却不起作用。即使我尝试转义正斜线,似乎也有些不足,我可以通过RegEx文档获得不同的意见。
DEVICENAME Gig 2/0/45 136 R T AIR-CAP35 Gig 0
DEVICENAME Gig 2/0/47 158 R T AIR-CAP35 Gig 0
DEVICENAME Gig 1/0/1 174 R S I CISCO2921 Gig 0/1
DEVICENAME Gig 3/0/1 151 R S I CISCO2921 Gig 0/1
对于上面的Gig 3/0/1之类的输入,我得到的匹配看起来像是/ 1,/ 2,等等。请提供我所缺少的帮助,并且非常感谢Python对RegEx所做的解释!
我已经尝试过各种RegEx,例如Gig \ s?\ d +,它开始工作,但不会捕获扩展名。当我开始添加时,例如Gig \ s?\ d + / \ d + / \ d +,它的确很棒,但是如果没有3组数字,它将无法处理名称,例如在4500上,它们将更像Gig 4 / 30岁当我添加分组以有选择地为线卡堆栈中更靠后的接口添加/ \ d +时(例如在3750上),RegEx迅速在我可以通过测试器进行验证与通过Python进行验证之间落空。
如果我将最后一部分(例如Gig \ s?\ d +((/ \ d +)*))进行双重分组,它将不再捕获第一部分,这真的使我失望了。
最佳答案
似乎您使用了re.findall
函数。请注意,re.findall
将优先选择组。如果没有组,则只有它会返回匹配项。因此,我建议您将正则表达式中存在的捕获组转换为非捕获组。
r'Gig\s?\d+(?:/\d+)*'
码:
>>> s = """DEVICENAME Gig 2/0/45 136 R T AIR-CAP35 Gig 0
DEVICENAME Gig 2/0/47 158 R T AIR-CAP35 Gig 0
DEVICENAME Gig 1/0/1 174 R S I CISCO2921 Gig 0/1
DEVICENAME Gig 3/0/1 151 R S I CISCO2921 Gig 0/1"""
>>> re.findall(r'Gig\s?\d+(?:/\d+)*', s)
['Gig 2/0/45', 'Gig 0', 'Gig 2/0/47', 'Gig 0', 'Gig 1/0/1', 'Gig 0/1', 'Gig 3/0/1', 'Gig 0/1']
关于python - 如何在Python中使用RegEx选择简短的Cisco接口(interface)名称?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28564566/