正则匹配PDF文本异常求助:手动输入正则无法匹配复制文本可匹配
解决PDF文本中连字导致的正则匹配失败问题
这问题我之前踩过坑!核心原因是PDF里的"profit"中的"fi"是连字(ligature)——也就是把f和i合并成了一个单独的Unicode字符(fi,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'(注意中间的fi是单个字符),而不是'profit'。
内容的提问来源于stack exchange,提问作者Muhammad Hassan




