如何用 Python 删除具有前缀重复关系的行,仅保留最长匹配行

12次阅读

如何用 Python 删除具有前缀重复关系的行,仅保留最长匹配行

本文介绍一种针对特定文本结构的去重策略:当后续行以前一行内容为前缀时,自动跳过较短的行,只保留最长的连续前缀链末尾行。适用于日志、命令输出等逐层扩展的文本处理场景。

在文本处理中,常见的“重复”并非完全相同的行,而是存在前缀包含关系——例如:

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:" 开头的不同链),则需改用递归解析;但对线性扩展型日志,本方案轻量、高效、易维护。

text=ZqhQzanResources