在世修行头像
关注

干货:正则表达式的另一种应用

横竖双版式批号正则:稳健匹配的取舍

现实:同一批 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]+)?(保留前两段),从 9471A9471A-5。这就是在调"识别到什么粒度"的边界。

正则识别,关键是先想清楚你要哪段、容错多少,再动手,别一把梭。


转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/caixuwen/article/details/166081852

文章来源转载

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--