如何使用Python正则提取config firewall policy到end之间的指定内容
Python正则提取指定起止字符串间内容的解决方法
问题原因
原有正则存在两个核心问题:
- 未限制
end为行首字符,会匹配到文本中间出现的end子串(比如示例中uuid、接口名字段里的end),导致匹配提前终止 - 未开启正则匹配的对应模式,无法精准识别行首标记和跨行内容
解决代码
import re # 原始文本赋值 abovetext = """ config firewall policy edit 1 set name "demo" set uuid demo set srcintf "demo-b-demo" set dstintf "demo" set srcaddr "demo.demo.demo.110" "host_10.demo.demo.129" next edit 2 set name "demo rule" set uuid demo-c532-51eb-end-demo set srcintf "end-demo-demo" set dstintf "demo" set srcaddr "demo.40.demo.129" "demo.40.demo.110" next end config firewall policy edit 3 set name "VIP-demo" set uuid demo-d428-end-demo-demo set srcintf "demo-b-inside" set dstintf "demo" set srcaddr "demo.demo.128.demo" "demo.demo.128.demo" next end """ # 提取首个匹配段 match_res = re.search(r'config firewall policy\n(.*?)^end', abovetext, flags=re.DOTALL | re.MULTILINE) if match_res: # 去除末尾多余换行后输出 print(match_res.group(1).rstrip())
参数说明
re.DOTALL:让正则中的.可以匹配换行符,无需用[\s\S]这类替代写法实现跨行匹配re.MULTILINE:让^匹配每一行的行首,而非仅匹配整个字符串的开头,可精准识别单独占行、行首为end的终止标记- 非贪婪匹配符
.*?:保证匹配到第一个符合条件的终止标记就停止,不会继续向后匹配到后续段落的终止位置
如果需要提取所有符合规则的段落,将re.search替换为re.findall即可,返回结果为所有段落内容组成的列表。
内容的提问来源于stack exchange,提问作者Manish Choudhary
相关产品推荐
相关产品推荐

