正则表达式提取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")
代码说明
- 正则匹配逻辑:
r'(\d{4})\s+([\d.]+)'精准匹配4位年份,后跟任意空白符(含换行、制表符),再匹配带小数点的温度数值,全局覆盖所有页面的表格行。 - 多页处理:
extract_text默认提取PDF全部页面文本,正则全局匹配自然覆盖多页数据,无需单独处理分页逻辑。 - 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
相关产品推荐
相关产品推荐

