假设我有以下文本
bridge-domain 30
bridge-domain 35
bridge-domain 40
bridge-domain 42
bridge-domain 44
bridge-domain 54
member GigabitEthernet0/0/7 service-instance 54
member GigabitEthernet0/0/8 service-instance 54
member GigabitEthernet0/0/10 service-instance 54
member GigabitEthernet0/0/11 service-instance 54
member vfi VLAN54
!
bridge-domain 61
bridge-domain 88
bridge-domain 93
member GigabitEthernet0/0/5 service-instance 93
member GigabitEthernet0/0/8 service-instance 93
member vfi VLAN93
!
我想要桥接域部分,所以我使用以下正则表达式:
bridge_domain_sections = re.findall(r"n(bridge-domainsd+.*?n!)", source, re.M|re.S)
我明白了,
['bridge-domain 30 nbridge-domain 35 nbridge-domain 40 nbridge-domain 42 nbridge-domain 44 nbridge-domain 54 n member GigabitEthernet0/0/7 service-instance 54n member GigabitEthernet0/0/8 service-instance 54n member GigabitEthernet0/0/10 service-instance 54n member GigabitEthernet0/0/11 service-instance 54n member vfi VLAN54n!', 'bridge-domain 61 nbridge-domain 88 nbridge-domain 93 n member GigabitEthernet0/0/5 service-instance 93n member GigabitEthernet0/0/8 service-instance 93n member vfi VLAN93n!']
而我只需要以";桥接域。。。以结尾">
['nbridge-domain 54 n member GigabitEthernet0/0/7 service-instance 54n member GigabitEthernet0/0/8 service-instance 54n member GigabitEthernet0/0/10 service-instance 54n member GigabitEthernet0/0/11 service-instance 54n member vfi VLAN54n!', 'bridge-domain 93 n member GigabitEthernet0/0/5 service-instance 93n member GigabitEthernet0/0/8 service-instance 93n member vfi VLAN93n!']
我知道它贪婪地匹配开始,不知道如何纠正这一点,任何帮助理解这一点的都非常感谢
您可以匹配桥接域,然后匹配所有不以桥接域或!
开头的行,然后匹配第一行只有!
请注意,使用s
也可以匹配换行符。如果要匹配除换行符之外的多个空白字符,可以使用[^Srn]*
。
^bridge-domain d+ *(?:r?n(?!bridge-domain d|!$).*)*r?n!$
^
字符串开始bridge-domain d+ *
匹配桥接域、一个空格和1+个数字加上可选空格(?:
非捕获组r?n(?!bridge-domain d|!$).*
如果换行符不是以桥域和数字开头,或者仅以数字开头,则匹配换行符和整行
)*
关闭非捕获组并可选地重复(如果必须至少有一行,则使用+(r?n!
匹配换行符和$
字符串末尾
Regex演示
或者匹配桥域,只检查下一行是否从桥域开始,并尽可能少地匹配行,直到第一行只有!
^bridge-domain d+ *r?n(?!bridge-domain d)(?:.*r?n)*?!$
^
字符串开始bridge-domain d+ *r?n
匹配桥接域、1+位数字、可选whitspace字符和换行符(?!bridge-domain d)
否定前瞻,断言字符串不是以桥域开头,后跟空格和数字(?:.*r?n)*?
在换行符后面尽可能少地重复行!
匹配!
$
字符串结束
Regex演示
注意如果桥接域线路位于成员GigabitEthernet之间,则此模式可以匹配桥接域线路,因为第一个前瞻仅断言从该位置桥接域不直接向右。