使用Python invoice2data提取PDF发票时正则匹配不全问题求助
解决PDF转文本后"CGK / WIII"匹配不全的问题
问题根源
你遇到的情况是PDF转文本时,部分"CGK / WIII"里的空格并非普通空格(ASCII 32),而是非标准空白字符(比如不间断空格\u00A0、全角空格\u2000系列),肉眼无法区分,但正则或字符串匹配会严格识别编码,导致漏匹配。
具体解决方案
排查字符编码
用Python打印疑似行的字符编码,确认特殊字符:# 取一行疑似"CGK / WIII"的文本 line = "CGK / WIII ..." # 替换为你实际的问题文本行 print([(c, ord(c)) for c in line[:8]])输出里如果看到空格的编码不是32,就说明是特殊空白字符导致的问题。
调整正则表达式
把匹配空格的部分改成能兼容所有空白的规则:- 匹配任意数量的空白(包括特殊空格):
CGK\s+\/\s+WIII - 精准匹配常见特殊空白:
CGK[\u0020\u00A0\u2000-\u200F]*\/[\u0020\u00A0\u2000-\u200F]*WIII
替换你原来的正则,就能匹配到所有4行内容。
- 匹配任意数量的空白(包括特殊空格):
预处理文本统一空白
先把所有非标准空白替换成普通空格,再进行匹配:import re # 清理文本中的特殊空白 cleaned_text = re.sub(r'[\u00A0\u2000-\u200F\u202F]', ' ', raw_pdf_text) # 现在直接匹配固定字符串或原正则都能生效 all_matches = re.findall(r'CGK / WIII', cleaned_text)适配invoice2data模板
如果是用invoice2data的YAML模板,直接把字段的正则改成兼容版本:fields: flight_entries: regex: 'CGK\s+\/\s+WIII.*' type: list group: all
内容的提问来源于stack exchange,提问作者regulus
相关产品推荐
相关产品推荐

