如何在匹配指定子串后提取并打印目标金额数字?
问题:提取目标子串后的第二个金额数字
我从OCR识别的发票文本中筛选出指定子串后,需要提取该子串后的第二个金额数字(示例中对应3.304,08)。
完整识别文本:
Koopliedenweg 38 Deb. nr. : 108636 2991 LN BARENDRECHT Your VAT nr. : NL851703884B01 Nederland Factuur datum : 19-11-21 Aantal Omschrijving Prijs Bedrag Order number : 76372 Loading date : 15-11-21 Incoterm: : FOT Your ref. : SCHOOLFRUIT Delivery date : WK46 Verdi Import Schoolfruit 566 Ananas Crownless 14kg 10 Sweet CR Klasse I € 7,00 € 3.962,00 706 Appels Royal Gala 13kg 60/65 Generica PL Klasse I € 4,68 € 3.304,08 598 Peen Waspeen 14x1lkg 200-400 Generica BE Klasse I € 6,30 3.767,40 Order number : 76462 Loading date : 18-11-21 Incoterm: : FOT Your ref. : SCHOOLFRUIT Delivery date
目标子串:
Appels Royal Gala 13kg 60/65 Generica PL Klasse I
我尝试了以下Python代码,但只能获取索引值,不知道怎么提取目标数字,求更优方案:
pdfFile = wi( filename="C:\Users\engel\Documents\python\docs\fixedPDF.pdf", resolution=300) image = pdfFile.convert('jpeg') imageBlobs = [] for img in image.sequence: imgPage = wi(image=img) imageBlobs.append(imgPage.make_blob('jpeg')) text_factuur_verdi = [] appels_royal_gala = 'Appels Royal Gala 13kg 60/65 Generica PL Klasse I' ananas_crownless = 'Ananas Crownless 14kg 10 Sweet CR Klasse I' peen_waspeen = 'Peen Waspeen 14x1lkg 200-400 Generica BE Klasse I' for imgBlob in imageBlobs: image = Image.open(io.BytesIO(imgBlob)) text = pytesseract.image_to_string(image, lang='eng') text_factuur_verdi.append(text) allSubstring = re.search(appels_royal_gala, text) #indexEndAllsubstring = ' '.join(allSubstring) print(allSubstring.end() + 11)
解决方案:用正则直接匹配目标金额
手动计算索引容易受OCR识别的空格、换行变化影响,建议用正则表达式直接匹配目标子串后的第二个金额,一步到位:
- 构造正则模式:利用
re.escape()处理目标子串中的特殊字符,然后匹配后面的两个金额格式(带€符号,数字包含逗号、点),捕获第二个金额。 - 替换原有搜索逻辑,直接提取捕获组内容。
修改后的代码片段:
import re # ... 保留原有PDF转图片、OCR识别的代码 ... for imgBlob in imageBlobs: image = Image.open(io.BytesIO(imgBlob)) text = pytesseract.image_to_string(image, lang='eng') text_factuur_verdi.append(text) # 构造正则模式,匹配目标子串后的第二个金额 pattern = re.compile( re.escape(appels_royal_gala) + r"\s+€\s+[\d,.]+\s+€\s+([\d,.]+)" ) match = pattern.search(text) if match: target_amount = match.group(1) print(f"提取到的目标金额:{target_amount}") else: print("未找到匹配的金额")
说明:
re.escape(appels_royal_gala):避免子串中的特殊字符(比如空格、/)被正则解析为语法符号。[\d,.]+:匹配金额格式,支持千分位点和小数位逗号的欧洲格式。- 捕获组
([\d,.]+):直接提取第二个金额的数字部分。
内容的提问来源于stack exchange,提问作者mightycode Newton
相关产品推荐
相关产品推荐

