
本文介绍一种python脚本方案,用于识别并删除“逐行递增前缀重复”的文本行(如“this” → “this line” → “this line has”),仅保留每组中最长的那行,适用于日志精简、命令输出去重等场景。
在处理某些结构化文本(例如命令行逐步输出、分步调试日志或自动生成的描述性语句)时,常出现“前缀嵌套式重复”:后一行完全以前行内容为开头,形成递增包含关系。此时,标准去重(如基于set()的精确匹配)完全无效——因为每一行字面值都不同。真正需要的是逻辑去重:将具有相同起始子串、且呈连续递增关系的行视为一个“前缀链”,只保留链中最后一项(即最长行)。
以下脚本实现了这一逻辑:
infilename = "input.txt" # 替换为你的输入文件路径
with open(infilename) as fin:
# 读取所有行并去除末尾换行符(避免因\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
# 此时lines[i]是当前前缀链中最长的行,输出它
print(lines[i])
i += 1运行效果示例(输入为题目所给内容):
This This line This line has This line has five This line has five strings
输出仅一行:
立即学习“Python免费学习笔记(深入)”;
This line has five strings
✅ 关键设计说明:
- 使用 str.startswith() 判断前缀关系,天然支持“逐行嵌套”逻辑;
- map(str.rstrip, fin) 确保无换行符干扰,避免 "This\n".startswith("This") 返回 False;
- 单次遍历 + 指针跳跃(i += 1 在内层while中),时间复杂度 O(n),高效可靠;
- 未修改原文件,安全可控;如需写入文件,只需将 print(lines[i]) 替换为 outfile.write(lines[i] + '\n')。
⚠️ 注意事项:
- 该算法假设输入已按“前缀→扩展”自然顺序排列(如题目所示)。若行序混乱(如 "This line has" 出现在 "This" 之前),结果不可靠;预处理排序(如 sorted(lines, key=len))可增强鲁棒性,但会改变原始语义顺序,请按需权衡;
- 空行或纯空白行可能导致意外行为,建议前置过滤:lines = [line.rstrip() for line in fin if line.strip()];
- 若需严格区分大小写或忽略首尾空格,可在比较前统一标准化(如 .strip().lower())。
此方法精准解决“前缀链压缩”问题,比正则或模糊匹配更简洁、可读性强,是文本流后处理的实用利器。










