你的正则表达式在匹配时出现了一些问题,导致无法正确提取ip binding vpn-instance VPNA
中的VPNA
。我们可以简化正则表达式,并确保它能够正确匹配和提取所需的内容。
1. 简化正则表达式
我们可以将正则表达式分成两部分:一部分用于匹配interface
声明,另一部分用于匹配ip binding vpn-instance
和ip address
。
2. 修改后的正则表达式
import re
a = '''
interface Eth-Trunk2.489
vlan-type dot1q 489
ipv6 enable
ip address 192.168.2.69 255.255.255.252
#
interface Eth-Trunk2.491
vlan-type dot1q 491
ip binding vpn-instance VPNA
ipv6 enable
ip address 192.168.2.101 255.255.255.252
'''
# 正则表达式
pattern = re.compile(r'''
interface\s+(\S+)\n # 匹配 interface 声明
.*\n # 匹配任意行
(?: # 非捕获组
ip\s+binding\s+vpn-instance\s+(\S+)\n # 匹配 ip binding vpn-instance
)? # 可选
.*\n # 匹配任意行
ip\s+address\s+(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\s+\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) # 匹配 ip address
''', re.VERBOSE)
# 查找匹配项
matches = re.findall(pattern, a)
# 打印结果
for match in matches:
interface, vpn_instance, ip_address = match
print(f"Interface: {interface}, VPN Instance: {vpn_instance}, IP Address: {ip_address}")
3. 解释正则表达式
interface\s+(\S+)\n
:匹配interface
声明,并捕获接口名称。.*\n
:匹配任意行。(?:ip\s+binding\s+vpn-instance\s+(\S+)\n)?
:非捕获组,匹配ip binding vpn-instance
并捕获VPN实例名称,该组是可选的。.*\n
:匹配任意行。ip\s+address\s+(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\s+\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})
:匹配ip address
并捕获IP地址和子网掩码。
4. 运行结果
运行上述代码后,你将得到以下输出:
Interface: Eth-Trunk2.489, VPN Instance: , IP Address: 192.168.2.69 255.255.255.252
Interface: Eth-Trunk2.491, VPN Instance: VPNA, IP Address: 192.168.2.101 255.255.255.252
5. 总结
通过简化正则表达式并确保每个部分都能正确匹配和捕获所需的内容,我们可以成功提取ip binding vpn-instance VPNA
中的VPNA
,并在没有ip binding vpn-instance
时略过。