
本文介绍一种针对特定文本结构的去重策略:当后续行以前一行内容为前缀时,自动跳过较短的行,只保留最长的连续前缀链末尾行。适用于日志、命令输出等逐层扩展的文本处理场景。
在文本处理中,常见的“重复”并非完全相同的行,而是存在前缀包含关系——例如:
This This line This line has This line has five This line has five strings
这种结构呈现逐层扩展特征,每一行都是下一行的前缀。用户需求不是简单去重,而是保留每条“前缀链”的最长末端行(即第5行),删除所有中间较短的前缀行。
以下是一个简洁高效的解决方案:
infilename = "input.txt" # 替换为你的输入文件路径
with open(infilename) as fin:
# 读取所有行并去除换行符(rstrip 避免因\n导致startswith匹配失败)
lines = list(map(str.rstrip, fin))
i = 0
while i < len(lines):
# 向后检查:若下一行以当前行开头,则当前行为前缀,应跳过
while i + 1 < len(lines) and lines[i + 1].startswith(lines[i]):
i += 1 # 跳过当前行,继续检查更长的前缀
print(lines[i]) # 输出该前缀链中最长的行
i += 1✅ 运行效果(对示例输入):
仅输出 This line has five strings —— 完全符合预期。
⚠️ 注意事项:
立即学习“Python免费学习笔记(深入)”;
- 该逻辑依赖行序:必须保证文本天然按“由短到长前缀”顺序排列;若顺序混乱(如 This line has five 出现在 This 之前),结果将不正确;
- str.startswith() 匹配是严格前缀(左对齐、无空格/边界限制),确保语义准确;
- 若需写入文件而非打印,可将 print(lines[i]) 替换为 outfile.write(lines[i] + '\n'),并提前打开输出文件(建议使用 with 语句管理);
- 空行或纯空白行可能干扰匹配,预处理时可添加 if lines[i].strip(): 过滤。
? 进阶提示:若需支持多分支前缀树(如并列的 "Error:" 和 "Warning:" 开头的不同链),则需改用栈或递归解析;但对线性扩展型日志,本方案轻量、高效、易维护。










