如何在 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())
我正在寻找 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())