You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何仅在每组<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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 12:03:22