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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 20:15:38