首页 > 解决方案 > 如何在 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+,那么我不确定中间有多少行,因为.*不能去另一行。

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

标签: pythonregexnetworkingautomationmultiline

解决方案


您可以使用

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.Minline 选项(使^匹配开始于任何行)
  • ^- 线开始
  • ip dhcp- 固定字符串
  • .*- 线路的其余部分
  • (?:\n(?!!).*)*- 如果不是以开头,则有零行或多行!
  • \n- 换行符
  • .*override- 除换行符以外的任何零个或多个字符,尽可能多,然后override.

请参阅正则表达式演示

在 Python 方面,直接将.group()方法调用链接在re.search. 先获取匹配比较安全,如果成功,访问组值:

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

推荐阅读