mactch开关输出上的python正则表达式

2024-09-27 00:19:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我从cisco交换机命令中得到一个字符串:

interface FastEthernet2/0/45
 switchport access vlan 703
 switchport mode access
interface FastEthernet2/0/46
 switchport access vlan 703
 switchport mode access
interface FastEthernet2/0/47
 switchport access vlan 703
 switchport mode access
interface FastEthernet2/0/48
 switchport access vlan 311
 switchport mode access
interface GigabitEthernet2/0/1
interface GigabitEthernet2/0/2
interface GigabitEthernet2/0/3
interface GigabitEthernet2/0/4

我想用pyhon re按每个接口切割它们,比如:

^{pr2}$

我记得可以通过非贪心来捕捉“接口”作为每个模式的停止点。不幸的是,这个regex:“(interface.*?)”只获取每个“接口”,但端口号和详细信息。我可以找到一个明显的结束字符,让re得到“interface”和后面的字符串。在

也许这很简单,但我完全明白了。。。在


Tags: 字符串命令reaccessmode模式ciscointerface
3条回答
>>> re.findall(r"(interface\s*FastEthernet\d+\/\d+\/\d+[^\n]+\n[^\n]+\n[^\n]*)", YOUR_STRING, re.S|re.I)
['interface FastEthernet2/0/45\n switchport access vlan 703\n switchport mode access', 'interface FastEthernet2/0/46\n switchport access vlan 703\n switchport mode access', 'interface FastEthernet2/0/47\n switchport access vlan 703\n switchport mode access', 'interface FastEthernet2/0/48\n switchport access vlan 311\n switchport mode access']

Python不允许使用空匹配进行拆分,因此必须编写一个正则表达式来匹配每个接口的所有行。在

import re
re.findall(r'^interface.*(?:\n[\t ]+.*)*', input, re.M)

正则表达式从以^interface.*开头的行开始匹配,然后匹配新行字符,如果下一行的开头有一个或多个空格[\t ]+,则继续匹配。在

Demo on regex101

注意\n是如何在重复开始时包含的。如果输入不以新行结束,则此构造允许正则表达式匹配最后一条记录。在

只需根据interface之前存在的换行符进行拆分

re.split(r'\s*\n\s*(?=interface\b)', s)

示例:

^{pr2}$

相关问题 更多 >

    热门问题