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

正则表达式提取PDF匹配内容问题:重复数据与分页提取

问题解决:正则提取PDF多页年份与温度数据生成CSV

原代码问题分析

  • 截取位置计算错误:el1+len(p1)中,len(p1)是"Year"的匹配次数,而非"Year"字符串本身的长度,应该用len("Year")跳过标题文本。
  • 未按行拆分数据:直接截取标题间的大段文本,没有拆分每行的年份和温度,导致数据重复、混乱。
  • 未覆盖多页内容:仅处理了第一组标题区间,忽略了后续页面的表格数据。

修正后的正则实现代码

import re
from pdfminer.high_level import extract_text

# 注意路径用原始字符串避免转义问题
PDF_path = r"B:\Py\PDF_to_CSV\Annual_Average_Temperature_By_Year.pdf"

# 提取PDF所有页面的文本
text = extract_text(PDF_path)

# 匹配每行的年份(4位数字)和温度(带小数点的数值)
# re.MULTILINE确保每行开头的年份能被匹配
data_pattern = re.compile(r'(\d{4})\s+([\d.]+)', re.MULTILINE)

# 提取所有符合格式的年份-温度对
all_matches = data_pattern.findall(text)

# 拆分年份和温度列表
Year = [item[0] for item in all_matches]
Temp = [item[1] for item in all_matches]

# 生成并保存CSV文件
csv_header = "Year,Annual Average Temperature (F)\n"
csv_rows = "\n".join([f"{y},{t}" for y, t in zip(Year, Temp)])

with open("temperature_data.csv", "w", encoding="utf-8") as f:
    f.write(csv_header + csv_rows)

# 打印前10条数据验证
print("前10条提取结果:")
for y, t in zip(Year[:10], Temp[:10]):
    print(f"{y} | {t}°F")

代码说明

  1. 正则匹配逻辑:r'(\d{4})\s+([\d.]+)' 精准匹配4位年份,后跟任意空白符(含换行、制表符),再匹配带小数点的温度数值,全局覆盖所有页面的表格行。
  2. 多页处理:extract_text默认提取PDF全部页面文本,正则全局匹配自然覆盖多页数据,无需单独处理分页逻辑。
  3. CSV格式化:直接拼接表头和每行数据,确保输出格式符合CSV规范。

额外优化提示

如果PDF中存在非表格的4位数字(比如页码),可以先定位表格区域再匹配:

# 定位表格起始和结束位置
start_pos = text.find("Year") + len("Year")
end_pos = text.rfind("Annual Average Temperature (F)") + len("Annual Average Temperature (F)")
table_text = text[start_pos:end_pos]

# 仅在表格区域内匹配数据
all_matches = data_pattern.findall(table_text)

内容的提问来源于stack exchange,提问作者Brooke

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 23:43:11