如何用Python正则删除短行(移除纯文本中的标题与表格数据)
解决方案
问题分析
你之前的正则(?<=\n)\d{1,10}(?=\n)失败的核心原因:
- 仅匹配纯数字(1-10位),但表格数字行通常包含小数点、千分位逗号、正负号或前后空白
- 依赖单一的
\n换行符,实际文件可能用\r\n(Windows)或\r(旧Mac)作为换行标识 - 未考虑数字行前后存在的空白字符
优化正则方案
针对不同类型的待移除内容,分别编写精准正则:
1. 匹配表格数字行
覆盖带正负号、千分位、小数的数字行,允许前后空白:
^\s*[-+]?\d{1,3}(?:,\d{3})*(?:\.\d+)?\s*$
^\s*:匹配行首任意空白[-+]?:可选的正负号\d{1,3}(?:,\d{3})*:匹配支持千分位的整数部分(?:\.\d+)?:可选的小数部分\s*$:匹配行尾任意空白
2. 匹配表格日期行(以连续年份为例)
针对类似2023 2022 2021的日期行:
^\s*(?:\d{4}\s+){2,}\d{4}\s*$
如果是月份+年份格式(如Dec 2023 Nov 2022),可调整为:
^\s*(?:(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s+\d{4}\s+){2,}(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s+\d{4}\s*$
3. 匹配财务类标题行
针对类似Diluted earnings per share (in EUR)的标题:
^\s*[A-Za-z\s()]+(?:in\s+[A-Z]{3})?\s*$
如果标题是全大写格式,可简化为:
^\s*[A-Z\s()]+(?:IN\s+[A-Z]{3})?\s*$
批量替换操作示例(Python)
将上述正则组合,批量移除目标行并清理多余空行:
import re # 读取原始文件 with open("input.txt", "r", encoding="utf-8") as f: content = f.read() # 组合所有待移除行的正则,开启多行模式 pattern = re.compile( r"^\s*[-+]?\d{1,3}(?:,\d{3})*(?:\.\d+)?\s*$|" r"^\s*(?:\d{4}\s+){2,}\d{4}\s*$|" r"^\s*[A-Za-z\s()]+(?:in\s+[A-Z]{3})?\s*$", re.MULTILINE ) # 移除目标行并清理多余空行 clean_content = pattern.sub("", content) clean_content = re.sub(r"\n{2,}", "\n\n", clean_content).strip() # 写入处理后的文件 with open("output.txt", "w", encoding="utf-8") as f: f.write(clean_content)
注意事项
- 若文件存在特殊格式的表格行,可根据实际内容微调正则
- 测试时先提取部分内容验证匹配效果,再批量处理
内容的提问来源于stack exchange,提问作者Limps
相关产品推荐
相关产品推荐

