如何使用Python从谷歌OCR导出的收银小票CSV中提取指定数据
收银小票指定信息提取解决方案
你之前操作的核心问题
- 错误拆分结构:用
re.split(r'\s+', text)直接把所有文本拆成独立单词,完全破坏了小票原有的行级布局和关键字的位置关联,不利于范围定位 - 遍历方式错误:直接写
for sentence in text是遍历字符串的单个字符,不会得到逐行内容,正确做法是先对原文本按换行符拆分得到行列表 - 正则匹配逻辑不全:只匹配了SUBTOTAL、TOTAL关键字本身,没有关联捕获关键字前后的目标金额内容
具体实现代码
import re # 先按行拆分原始文本,过滤空行保留有效内容 lines = [line.strip() for line in text.splitlines() if line.strip()] extract_result = {} # 1. 提取商品列表:ABN所在行之后、Qty字段所在行之前的所有内容 abn_idx = next(i for i, line in enumerate(lines) if "ABN" in line) qty_idx = next(i for i, line in enumerate(lines) if line == "Qty") extract_result["商品列表"] = lines[abn_idx+1 : qty_idx] # 2. 提取SUBTOTAL前面的金额数字 subtotal_match = re.search(r"(\d+)\s*SUBTOTAL", text) if subtotal_match: extract_result["SUBTOTAL金额"] = subtotal_match.group(1) # 3. 提取TOTAL后面的总金额 total_match = re.search(r"TOTAL\s*[\n\s]*(\$\d+\.\d{2})", text) if total_match: extract_result["TOTAL总金额"] = total_match.group(1) # 输出最终提取结果 print(extract_result)
补充优化提示
如果需要清洗商品名里的OCR异常前缀(比如^H、*H、#M等),可以对每个商品行执行re.sub(r'^[\^*#]H?&?', '', 商品行内容)做批量清理;如果遇到ABN行匹配不准的情况,可以把ABN行的匹配逻辑调整为正则匹配re.search(r'ABN\s+\d{2}\s+\d{3}\s+\d{3}\s+\d{3}', line),匹配精度更高。
内容的提问来源于stack exchange,提问作者WMD
相关产品推荐
相关产品推荐

