如何用正则表达式修复PDF提取文本中的重复字母问题?
解决PDF OCR粗体字重复字符问题
这种PDF OCR识别粗体字时出现的重复字符问题太常见了!你之前尝试的正则思路方向是对的,但因为没区分OCR错误导致的全单词字母重复和单词本身的正常连续重复字母,所以才会出现assesses被误改的情况。
问题分析
你的原文本中,错误的单词(oouurr、rreeffoorrmmeedd、tteeaacchhiinngg)有个明显特征:每个字母都连续重复两次,而正常单词(比如assesses)只是部分字母重复,且相邻字符不全是成对相同的。之前的正则要么会误改正常单词,要么只能处理局部的重复字母对,没法覆盖所有情况。
完美解决方案
我们可以用Python的正则配合回调函数,先识别出符合OCR错误特征的单词,再针对性修复:
import re text = 'and assesses oouurr rreeffoorrmmeedd tteeaacchhiinngg in the classroom' def fix_ocr_duplicate_words(match): word = match.group(0) # 先过滤长度为奇数的单词(不可能是全字母重复的OCR错误) if len(word) % 2 != 0: return word # 检查是否每个相邻字符都成对相同 is_ocr_error = True for i in range(0, len(word), 2): if i + 1 >= len(word) or word[i] != word[i+1]: is_ocr_error = False break # 如果是OCR错误,提取每个重复对的第一个字符 if is_ocr_error: return ''.join([word[i] for i in range(0, len(word), 2)]) # 否则返回原单词 else: return word # 匹配所有小写字母组成的单词 fixed_text = re.sub(r'\b[a-z]+\b', fix_ocr_duplicate_words, text) print(fixed_text)
运行结果
执行后会输出正确文本:
and assesses our reformed teaching in the classroom
为什么这个方案有效?
- 精准识别错误单词:通过检查单词长度是否为偶数,且每两个相邻字符都相同,确保只处理OCR导致的全重复单词,不会误改
assesses这类正常单词。 - 针对性修复:对确认的错误单词,提取每一对重复字母的第一个字符,直接还原成原单词。
如果你只想用纯正则(不用回调函数),其实很难完美区分正常重复和OCR错误重复,因为正则擅长模式匹配,但不擅长逻辑判断。上面的代码方案是最稳妥的。
内容的提问来源于stack exchange,提问作者aless80




