如何在 Python 中使用正则表达式搜索多行

How to search multiple lines using regex in Python

我正在寻找 Python 使用正则表达式的多行提取。

clock timezone EST -2 0

clock summer-time EDT recurring

!

ip dhcp snooping vlan 1-4094

no ip dhcp snooping information option

ip dhcp snooping

no ip domain-lookup

ip domain-name abc.com

ip device tracking probe auto-source override

!

crypto pki trustpoint TP-self-signed-142154678

我试过的正则表达式:

match = re.search(r"^ip dhcp.*/s+.*/s+.*/s+.*/s+.*/s+.*override",filename,flags=re.M).group(0)

但问题是行数不固定,因为它在其他设备上可能会有所不同,因为某些命令可能会丢失。

所以,我在这里寻找的是编写一个表达式,其中我只提到文件中的起点和终点以及可以提取中间的任何内容。如果我提到 \s+ 那么我不确定中间有多少行,因为 .* 不能转到另一行。

我正在寻找正则表达式或任何其他解决方案中的内容,以便我可以如上所述从起点到终点提取配置,而不管中间是否缺少行。

您可以使用

re.search(r"^ip dhcp.*(?:\n(?!!).*)*\n.*override",filename,flags=re.M)
re.search(r"(?m)^ip dhcp.*(?:\n(?!!).*)*\n.*override",filename)

注意:如果override需要整词匹配,用\b括起来,即(?m)^ip dhcp.*(?:\n(?!!).*)*\n.*\boverride\b.

模式匹配

  • (?m) - re.M 内联选项(使 ^ 匹配任何行的开头)
  • ^ - 行首
  • ip dhcp - 固定字符串
  • .* - 该行的其余部分
  • (?:\n(?!!).*)* - 如果不是以 !
  • 开头则为零行或多行
  • \n - 换行符
  • .*override - 除换行字符外的任何零个或多个字符,尽可能多,然后是 override.

参见regex demo

在 Python 端,在 re.search 之后直接链接 .group() 方法调用是不安全的。先获取匹配比较安全,如果成功,再访问组值:

match = re.search(r"(?m)^ip dhcp.*(?:\n(?!!).*)*\n.*override",filename)
if match:
    print(match.group())