正则表达式0-n次分组捕获:如何提取OSPF输出中所有IP行
解决方案
问题核心原因
正则里的重复捕获组(比如(...)+)只会保留最后一次匹配结果,这就是你只能拿到部分IP行的根源。得拆分匹配逻辑:先定位完整的数据区块,再逐行提取记录。
修改步骤
- 先匹配完整的Link States区块(包含标题、表头和所有数据行)
- 针对每个匹配到的区块,单独提取每一行的IP、宣告地址和存活时间记录
修改后的代码
import re def extract_ospf_records(infile): # 匹配整个Link States区块的正则 block_regex = re.compile( r"(?P<link_state>[\S ]* +Link States)(?: \(Area \S+\))?\n" r"\n*" r"Link ID +ADV Router +Age +Seq#.*\n" r"(?P<data_lines>(?:[\d.]+\s+[\d.]+\s+\d+\s+.*\n?)+)" ) # 提取单条记录的正则 record_regex = re.compile(r"(?P<link_id>[\d.]+)\s+(?P<adv_router>[\d.]+)\s+(?P<age>\d+)") records = [] with open(infile, "r") as f: content = f.read() # 找出所有Link States区块 for block_match in block_regex.finditer(content): data_lines = block_match.group("data_lines") # 逐行提取每条记录 for record_match in record_regex.finditer(data_lines): records.append({ "link_id": record_match.group("link_id"), "adv_router": record_match.group("adv_router"), "age": record_match.group("age") }) return records # 测试调用 for filename in ["ospf_r4.txt", "ospf_r1.txt"]: print(f"=== 从{filename}提取的记录 ===") for rec in extract_ospf_records(filename): print(f"{rec['link_id']:<15} {rec['adv_router']:<15} {rec['age']}")
代码说明
block_regex负责定位整个Link States区域,把所有数据行汇总到data_lines分组中record_regex专门匹配单条数据行,分别捕获Link ID、ADV Router和Age字段- 最终返回结构化的字典列表,方便后续业务处理
内容的提问来源于stack exchange,提问作者hfak
相关产品推荐
相关产品推荐

