weixin_39721336 2024-09-16 14:48 采纳率: 76.9%
浏览 4
已结题

python正则表达式获取不到指定的值



```python
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
 '''
    
geshiz=(r'interface (\w\S+\d)',
        r'.*\n?.*\n?.*\n?.*\n?( ip binding vpn-instance (\S+)\n)?.*\n?.*\n?.*\n?.*\n? ip address (\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3} \d{1,3}.\d{1,3}.\d\d{1,3}.{1,4})',
        )
geshi='\n'.join(geshiz)
print(re.findall(geshi,a))


我的想法是如果字符串中有 ip binding vpn-instance VPNA,就提取VPNA,如果没有 ip binding vpn-instance VPNA,就略过
但是得到的结果和预期不一样
[('Eth-Trunk2.489', '', '', '192.168.2.69 255.255.255.252'), ('Eth-Trunk2.491', '', '', '192.168.2.101 255.255.255.252')]
命名有VPNA的 没有打印出来

  • 写回答

1条回答 默认 最新

  • 码踏云端 Java领域新星创作者 2024-09-16 18:07
    关注

    你的正则表达式在匹配时出现了一些问题,导致无法正确提取ip binding vpn-instance VPNA中的VPNA。我们可以简化正则表达式,并确保它能够正确匹配和提取所需的内容。

    1. 简化正则表达式

    我们可以将正则表达式分成两部分:一部分用于匹配interface声明,另一部分用于匹配ip binding vpn-instanceip 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时略过。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 9月25日
  • 已采纳回答 9月17日
  • 创建了问题 9月16日

悬赏问题

  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见
  • ¥15 一共有五道问题关于整数幂的运算还有房间号码 还有网络密码的解答?(语言-python)
  • ¥20 sentry如何捕获上传Android ndk 崩溃
  • ¥15 在做logistic回归模型限制性立方条图时候,不能出完整图的困难
  • ¥15 G0系列单片机HAL库中景园gc9307液晶驱动芯片无法使用硬件SPI+DMA驱动,如何解决?