Python正则正向后行断言查找目标行前最近的object-group network行
问题原因
你原来使用的正则(object-group network.+)[\w\W]+?(?<=HD700041_10\.88\.64\.141)之所以匹配到更早的object-group network行,是因为正则默认从文本最左侧开始匹配,即使[\w\W]+?是非贪婪匹配,也会优先匹配第一个符合条件的object-group network开头的行,再向后匹配到目标行,自然得到的是最靠前的匹配结果,而非离目标最近的结果。
解决方法
方法1:调整正则表达式
你可以限制匹配的object-group行和目标行之间不能出现其他object-group network开头的行,就能保证匹配到的是离目标行最近的父行,Python代码示例如下:
import re config_text = """你的多行配置文本""" pattern = r'(object-group network[^\n]+)(?:\n(?!object-group network)[^\n]*)*\n\s*network-object object HD700041_10\.88\.64\.141' match = re.search(pattern, config_text) if match: # 输出匹配到的最近的object-group行 print(match.group(1))
正则逻辑说明:
(object-group network[^\n]+):捕获object-group network开头的整行内容(?:\n(?!object-group network)[^\n]*)*:匹配任意数量的非object-group network开头的行,其中(?!...)是负向零宽断言,避免中间出现其他object-group定义- 末尾匹配目标行,确保捕获到的object-group就是目标行所属的最近父级
方法2:逐行遍历(更推荐)
正则处理跨行文本容易出现边界问题,逐行遍历逻辑更简单易维护,性能也更稳定,尤其适合大体积的配置文件:
target_line = 'network-object object HD700041_10.88.64.141' latest_obj_group = None # 如果是读取本地配置文件可以用以下方式,文本内容直接遍历行即可 with open('配置文件路径', 'r', encoding='utf-8') as f: for line in f: line = line.rstrip('\n') if line.startswith('object-group network'): latest_obj_group = line if target_line in line: break if latest_obj_group: print(latest_obj_group)
遍历的时候只要遇到object-group network开头的行就更新记录值,遇到目标行直接终止遍历,此时记录的就是离目标行最近的父行。
内容的提问来源于stack exchange,提问作者Cow
相关产品推荐
相关产品推荐

