前面兩篇文介紹了 OCR 圖片辨識與 GPT 文字整理。
由於後續要利用 GPT 返還的文字執行爬蟲,為了避免 GPT 返還的文字不夠精確,若直接拿這些資料進行爬蟲查詢,可能會導致結果不準確,甚至查不到任何商品。
為了解決這個問題,系統利用正則表達式(Regex) 檢查並提取文字中「商品檢驗標識」及「批號」的資訊。
系統要找的有:
1.針對「商品檢驗標識」,找到 M / R / D 任一字母開頭的「字軌」+ 5個數字的組合。若找到 M 開頭的,要進一步搜尋「批號」。
2.針對「批號」,原則上先找「批號:」開頭,後面接的 7 個數字。
實作程式碼如下:
def find_bsmiNum_and_batchNum(ocrText):
// 定義「商品檢驗標識」的正則表示法:開頭必須是 M / R / D + 數字組合
// \b :單字的邊界,避免字母被誤判成其他字串的一部分
// [MRD] :必須是 M 或 R 或 D
// \s* :M/R/D 後面可以有 0 個或多個空格
// \d{5} :後面接的是 5 個數字
pattern_bsmiNum = r'\b[MRD]\s*\d{5}|\b[MRD]\s*\d[A-Z]\d{3}\b'
// 定義「批號」的正則表示法:優先找「批號:0000000」,找不到就退而求其次找任意7碼數字
pattern_batchNum = [r'批號\s*[::]?\s*\d{7}\b', r'\b\d{7}\b']
// 找「M/R/D字軌」
bsmiNum_matches = re.findall(pattern_batchNum, ocrText)
// 取第一個符合的字軌
bsmiNum = bsmiNum_matches[0] if bsmiNum_matches else False
batchNum = False
// 若找到的字軌是「M」,才進一步搜尋「批號」
if bsmiNum and bsmiNum.startswith("M"):
for pattern in pattern_batchNum:
batchNum_matches = re.findall(pattern, ocrText)
// 從結果中抽出「連續 7 個數字」
if batchNum_matches:
batchNum = re.search(r'\d{7}', batchNum_matches[0]).group()
break
//回傳結果:商品檢驗標識與批號
return bsmiNum, batchNum
透過這樣的處理,系統就能將 OCR 與 GPT 整理出的文字,轉換為精準的查詢條件,大幅提高後續爬蟲檢索的成功率,也讓資料治理更有系統性。
更多正則表示法的使用可以參考像是 w3schools 等線上資源。