You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

正则匹配PDF文本异常求助:手动输入正则无法匹配复制文本可匹配

解决PDF文本中连字导致的正则匹配失败问题

这问题我之前踩过坑!核心原因是PDF里的"profit"中的"fi"是连字(ligature)——也就是把f和i合并成了一个单独的Unicode字符(,U+FB01),而不是两个独立的f+i。你手动输入的"profit"是普通的字符组合,自然和提取出的文本不匹配;但复制的时候,大多数文本编辑器会自动把这个连字转换成普通的fi,所以复制到代码里就能正常匹配了。

给你几个实用的解决方案:

方案1:预处理文本,替换所有常见连字

最通用的方法是先把提取到的PDF文本里的连字替换成对应的普通字符,再做正则匹配。可以先定义一个常见连字的映射表,覆盖PDF里可能出现的情况:

import re

# 常见的英文连字映射
ligature_replacements = {
    'fi': 'fi',
    'fl': 'fl',
    'ff': 'ff',
    'ffi': 'ffi',
    'ffl': 'ffl',
    'ſt': 'ft'
}

def normalize_ligatures(text):
    # 遍历映射表替换所有连字
    for ligature, replacement in ligature_replacements.items():
        text = text.replace(ligature, replacement)
    return text

# 先处理文本,再匹配
processed_text = normalize_ligatures(extracted_pdf_text)
match = re.search(r'statement of profit or loss', processed_text, re.IGNORECASE)

方案2:修改正则表达式兼容连字

如果你不想预处理文本,也可以直接在正则里同时匹配普通字符和对应的连字。比如针对"profit",可以写成:

pattern = r'statement of pro(?:fi|fi)t or loss'
match = re.search(pattern, extracted_pdf_text, re.IGNORECASE)

不过这个方法的局限性是,你需要逐个处理可能出现连字的位置,不如预处理来得彻底。

额外小提示

如果想确认提取的文本里到底是什么字符,可以用repr()函数打印出来,比如print(repr(text)),这样就能看到'profit'(注意中间的是单个字符),而不是'profit'

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

火山引擎 最新活动