横竖双版式批号正则:稳健匹配的取舍
现实:同一批 pdf,版式不一样
我们处理的 PDF 有横版有竖版,批号的写法也不同:
- 横版:
9471A-5这样,字母数字混。 - 竖版:可能是数字开头、带横线和字母,比如
1A-2。
写一个正则想把两种情况都吃下,往往顾此失彼。第一性原理:把不同版式拆成不同正则,先横后竖逐个试,提高鲁棒性。
我们project的定义(process_pdf.py)
PATTERN_HORIZONTAL = re.compile(r"([A-Z0-9]{8,})", re.A) # 横版:8位长的字母数字
PATTERN_VERTICAL = re.compile(r"(\d+[A-Z]-?\d+)", re.A) # 竖版:数字+字母-数字
提取时先试横版再试竖版:
def extract_identifier(page_text):
m = PATTERN_HORIZONTAL.search(page_text or "")
if m:
return m.group(1)
m = PATTERN_VERTICAL.search(page_text or "")
return m.group(1) if m else None
稳定性 vs 精确性的取舍
正则的坑在于过度精确会脆,过度宽松会误判。我们的取舍:
- 横版用"8 位以上字母数字",宁可宽松一点,保证不漏;误判概率低,因为批号一般够长。
- 竖版用"数字开头 + 字母 + 可选横线",精确匹配竖版特征。
两个都写,只要一个命中就认定,命中不了返回 None,由上层决定归属。这种"宽松 + 多模式 fallback"在识别场景里比抠到极致的单正则可靠得多。
改一句话的教训
上次为了修母锭号,我把批号提取正从 [A-Za-z0-9]+(只取第一段)改成 [A-Za-z0-9]+(?:-[A-Za-z0-9]+)?(保留前两段),从 9471A 变 9471A-5。这就是在调"识别到什么粒度"的边界。
正则识别,关键是先想清楚你要哪段、容错多少,再动手,别一把梭。
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/caixuwen/article/details/166081852



