如何匹配模式的最新出现



假设我有以下文本

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之间,则此模式可以匹配桥接域线路,因为第一个前瞻仅断言从该位置桥接域不直接向右。

最新更新