如何用循环读取文件中匹配标记行间的指定行范围内容?
解决方案
核心思路
先把文件所有内容读入内存列表,方便随机访问;收集所有PROMPT#行的索引后,通过循环遍历这些索引,提取相邻索引之间的内容,最后处理最后一段到文件末尾。
修正后的完整代码
import re import os # 假设files是目录下的文件路径列表 files = [f for f in os.listdir('.') if os.path.isfile(f)] for file_path in files: with open(file_path, 'r') as f: # 读取所有行到列表,保留原始格式(包括换行) lines = f.readlines() # 收集所有匹配PROMPT#的行的索引(0-based)和对应的配置名 prompt_positions = [] for idx, line in enumerate(lines): stripped_line = line.strip() # 修正正则的拼写错误(原代码是PROMTP#,应该是PROMPT#) if re.search(r'PROMPT#', stripped_line): parts = stripped_line.split() if len(parts) >=3: config_name = parts[2] prompt_positions.append( (idx, config_name) ) # 提取各个配置段内容 for i in range(len(prompt_positions)): current_idx, current_name = prompt_positions[i] # 确定当前段的结束索引 if i < len(prompt_positions)-1: next_idx = prompt_positions[i+1][0] # 当前段是current_idx+1到next_idx-1(不包含next_idx) segment = lines[current_idx+1 : next_idx] else: # 最后一段,从current_idx+1到文件末尾 segment = lines[current_idx+1 :] # 处理或输出结果,这里示例是打印配置名和内容 print(f"=== 配置段: {current_name} ===") # 合并行并打印,也可以根据需求保存到文件等 print(''.join(segment).strip()) print("------------------------")
关键说明
- 读取所有行到列表:避免多次读取文件导致的指针问题,
lines列表可以直接通过索引访问任意行。 - 修正正则错误:原代码中
PROMTP#是拼写错误,改为PROMPT#才能正确匹配目标行。 - 索引处理:用Python列表默认的0-based索引,段落范围设为
current_idx+1到next_idx(左闭右开,刚好取到两个分隔行之间的内容)。 - 循环逻辑:通过
range(len(prompt_positions))遍历每个分隔点,判断是否是最后一个,分别处理中间段和末尾段。
输出示例(对应你的示例文件)
=== 配置段: startup-config === ! hostname bla ! no banner motd ------------------------ === 配置段: system === sysinfo(System Information) Main Memory Size : 512 MB flash Memory Size : 256 MB H/W Revision : VA0 NOS Version : 1.15 ------------------------ === 配置段: version === NOS version 1.15_0006 ------------------------
内容的提问来源于stack exchange,提问作者xynnnn0r
相关产品推荐
相关产品推荐

