You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在匹配指定子串后提取并打印目标金额数字?

问题:提取目标子串后的第二个金额数字

我从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识别的空格、换行变化影响,建议用正则表达式直接匹配目标子串后的第二个金额,一步到位:

  1. 构造正则模式:利用re.escape()处理目标子串中的特殊字符,然后匹配后面的两个金额格式(带€符号,数字包含逗号、点),捕获第二个金额。
  2. 替换原有搜索逻辑,直接提取捕获组内容。

修改后的代码片段:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 18:01:20