首页 > 解决方案 > 使用前瞻的正则表达式模式

问题描述

我正在尝试查找地址行,后面是接口行,例如

interface
   ip address a.a.a.a

标签: python-3.xregex

解决方案


如果要匹配包含类似格式的 ip 地址的多行,一种选择是使用PyPi 正则表达式模块\G锚点。

要获得更精确的 IP 地址模式,请参阅https://www.regular-expressions.info/ip.html

(?:^interface Vlan\r?\n\s*description .*\r?\n|\G(?!\A))\s*(ip address \d{1,3}(?:\.\d{1,3}){3})

在零件

  • (?:轮换的非捕获组
  • ^interface Vlan从行首逐字匹配
    • \r?\n\s*description .*\r?\n匹配换行符、描述和行的其余部分
    • |或者
    • \G(?!\A)在上一场比赛中断言位置,而不是在开始时
  • )关闭组
  • \s*匹配 0+ 个空白字符
  • (捕获组 1
    • ip address \d{1,3}匹配ip address 和 1-3 位数字
    • (?:\.\d{1,3}){3}重复 3 次匹配一个点和 1-3 个数字
  • )关闭组

正则表达式演示| Python 演示

示例代码

import regex

pattern = r"(?:^interface Vlan\r?\n\s*description .*\r?\n|\G(?!\A))\s*(ip address \d{1,3}(?:\.\d{1,3}){3})"

test_str = ("interface\n"
            "   description xxxxxxx\n"
            "   ip address 127.0.0.1\n"
            "!\n"
            "interface Vlan\n"
            "   description xxxxx\n"
            "   ip address 127.0.0.2\n"
            "   ip address 127.0.0.3\n"
            "   no abcd xxxxx eeeee\n"
            "!")

print(regex.findall(pattern, test_str, regex.MULTILINE))

输出

['ip address 127.0.0.2', 'ip address 127.0.0.3']

推荐阅读