如何匹配指定ID后跳转至下一行统计Solution词数?
问题需求与解决方案
需求说明
现有存储唯一ID的id.txt文件,以及包含日志内容的Sample.txt文件。需要实现以下逻辑:
- 读取
id.txt中的所有ID - 在
Sample.txt中匹配同时包含该ID和[RQ]标识的行 - 跳转到匹配行的下一行,统计其中
Solution关键词的出现次数 - 输出统计结果并写入文件
原代码存在的问题
- 未导入
re模块,正则表达式功能无法使用 readlines()读取的ID末尾带有换行符\n,会导致匹配失败- 正则表达式
r'{actual_id}|RQ'逻辑错误:既没有正确嵌入变量,又使用了“或”逻辑,不符合“同时包含ID和[RQ]”的需求 - 调用
line.next()错误:line是字符串类型,没有next()方法,应该通过文件迭代器获取下一行 - 逻辑判断
next_line == 'RQ'完全偏离需求,我们需要处理的是匹配行的下一行内容 - 每次循环重复打开日志文件,效率极低,且文件名与需求中的
Sample.txt不符 - 代码存在缩进错误,部分逻辑块未闭合
- 写入
output.txt的内容不符合需求,需求是统计次数而非写入行内容
正确实现代码
import re # 读取id.txt中的ID,去除换行和空白字符 with open('id.txt', 'r') as id_file: target_ids = [id_str.strip() for id_str in id_file.readlines() if id_str.strip()] # 遍历日志文件,处理匹配逻辑 results = {} with open('Sample.txt', 'r') as log_file: log_iter = iter(log_file) for line in log_iter: stripped_line = line.strip() # 检查当前行是否同时包含目标ID和[RQ] for target_id in target_ids: if target_id in stripped_line and '[RQ]' in stripped_line: try: # 获取匹配行的下一行 next_line = next(log_iter).strip() # 统计Solution关键词出现次数 solution_count = next_line.count('Solution') results[target_id] = solution_count print(f"ID {target_id}: Solution出现次数 = {solution_count}") except StopIteration: # 处理文件末尾无下一行的情况 results[target_id] = 0 print(f"ID {target_id}: 匹配行后无内容,Solution次数 = 0") break # 将结果写入输出文件 with open('output.txt', 'w') as output_file: for id_str, count in results.items(): output_file.write(f"ID: {id_str}, Solution出现次数: {count}\n")
代码关键点说明
- 先预处理目标ID,去除换行和空白字符,避免匹配错误
- 使用文件迭代器
iter(log_file),通过next()高效获取下一行内容 - 匹配逻辑改为同时包含目标ID和
[RQ],无需复杂正则 - 直接用
count('Solution')统计关键词,简洁高效 - 捕获
StopIteration异常,防止文件末尾无下一行导致崩溃 - 只打开一次日志文件,提升运行效率
内容的提问来源于stack exchange,提问作者Akash
相关产品推荐
相关产品推荐

