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

使用Python正则提取PDF中5位大写股票代码遇空输出问题求助

问题原因分析
  • 核心原因大概率是PyPDF2对该特殊PDF的文本提取能力不足:部分加密、排版复杂、内嵌字体特殊的PDF,用PyPDF2提取文本会返回空值或者乱码,自然匹配不到结果
  • 次要可能是正则匹配的边界问题:比如股票代码前后存在不可见特殊字符、括号为全角括号、字母中间存在隐形分隔符,都会导致现有正则匹配失败
优化方案
  1. 替换PDF提取库:优先使用pdfplumber,它对复杂PDF的文本提取准确率远高于PyPDF2,安装命令为pip install pdfplumber
  2. 提前清洗提取到的文本:过滤掉不可见控制字符、零宽空格等特殊符号,避免干扰匹配
  3. 优化正则规则:兼容全角/半角括号、括号前后可能存在的空格场景,同时可以根据需要适配无括号的纯代码展示场景
优化后可运行代码
import re
import itertools
import pdfplumber

# 替换为你的PDF文件路径
pdf_path = r'C:\Users\cummans\Jareds_code\Python\PDF Scrape\PDF Files\RJ Rec List.pdf'
ticker_ls = []

with pdfplumber.open(pdf_path) as pdf:
    for page in pdf.pages:
        txt = page.extract_text()
        if not txt:
            continue
        # 清洗文本:移除所有不可见特殊字符
        txt_clean = re.sub(r'[\x00-\x1F\x7F-\x9F\u200B-\u200D\uFEFF]', '', txt)
        # 匹配括号内的5位大写字母,兼容全角/半角括号、括号前后空格
        ls1 = re.findall(r'[((]\s*([A-Z]{5})\s*[))]', txt_clean)
        # 如需同时匹配无括号的独立5位大写字母,可取消注释下一行
        # ls1 += re.findall(r'(?<![A-Z])([A-Z]{5})(?![A-Z])', txt_clean)
        ticker_ls.append(ls1)

# 结果合并去重
check = list(itertools.chain(*ticker_ls))
clean_ticker_ls = list(dict.fromkeys(check))
print(clean_ticker_ls)
补充说明

如果运行上述代码仍无结果,说明该PDF为扫描版纯图片格式,普通文本提取工具无法识别内容,需要额外使用OCR工具(比如pytesseract配合pdf2image)将PDF页面转为图片识别文字后再做匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 03:54:02