如何仅在每组<tag>标签范围内去除文本重复行?
分组去除XML标签内的重复行
问题描述
我正在处理一份将转换为XML的文本文件,结构如下:
<tag> <cat1>Data</cat1> <cat2>Data</cat2> <cat3>Data</cat3> <cat1>Data</cat1> </tag> <tag> <cat1>Data</cat1> <cat2>Data</cat2> <cat3>Data</cat3> <cat1>Data</cat1> </tag> etc.
需求是仅在每组<tag>标签范围内去除重复行,即每组标签内只保留一行<cat1>。我已有一段通用去重代码:
input_file = "input.txt" with open(input_file, "r") as file: lines = file.readlines() new_lines = [] for line in lines: line = line.strip() if line not in new_lines: new_lines.append(line) out = "output.txt" with open(out, "w") as file2: file2.write("\n".join(new_lines))
请问能否修改这段代码,实现对每组<tag>标签分别进行重复行去除?
解决方案
可以通过按<tag>块分组处理的方式实现需求,修改后的代码如下:
input_file = "input.txt" output_file = "output.txt" with open(input_file, "r") as file: lines = file.readlines() result = [] in_tag = False seen = set() for line in lines: stripped_line = line.strip() # 处理<tag>起始标签,初始化当前块的去重集合 if stripped_line == "<tag>": in_tag = True seen.clear() result.append(line) continue # 处理</tag>结束标签,退出当前块 elif stripped_line == "</tag>": in_tag = False result.append(line) continue # 处于<tag>块内时进行去重 if in_tag: if stripped_line not in seen: seen.add(stripped_line) result.append(line) # 块外的行直接保留 else: result.append(line) # 将结果写入输出文件 with open(output_file, "w") as file2: file2.write("".join(result))
代码说明
- 使用
in_tag变量标记当前是否处于<tag>标签块内 seen集合专门记录当前<tag>块内已处理过的行,每个新块开始时会清空- 遇到
<tag>时初始化状态,遇到</tag>时结束当前块的去重逻辑 - 块内的行仅保留首次出现的内容,块外的行直接原样保留
- 保留了原文本的换行和缩进格式,避免破坏XML结构
内容的提问来源于stack exchange,提问作者gclt22
相关产品推荐
相关产品推荐

