求助:使用正则表达式提取收据OCR文本行首的整数数量
解决收据行首数量的正则匹配问题
没问题,我来帮你搞定这个正则表达式的需求!根据你列出的所有场景,我们需要匹配行首的1-2位整数,同时兼容后面可能跟着的x/X(带/不带空格)、-(带/不带空格)这些分隔符,甚至没有分隔符直接跟物品名的情况。
最终正则表达式
^(\d{1,2})(?:\s?[xX-]\s?)?
正则逻辑拆解
咱们来逐个部分解释,让你明白为什么它能覆盖所有场景:
^:强制匹配行首,确保我们抓取的是每一行开头的数量,不会误匹配中间的数字(\d{1,2}):捕获1到2位的整数(和你之前的逻辑一致,适合收据里的数量范围),这就是我们要提取的目标数字(?:\s?[xX-]\s?)?:这是一个非捕获组(?:开头),用来匹配可选的分隔符:\s?:匹配0个或1个空格,兼容分隔符前后有无空格的情况[xX-]:匹配x、X或者-这三种分隔符?:整个分隔符组是可选的,也就是说数字后面可以直接跟物品名(比如2 Burgers这种场景)
场景验证
用这个正则测试你列出的所有案例,都能正确捕获到数字2:
2 Burgers $4.00→ 捕获22 x Burgers $4.00→ 捕获22 X Burgers $4.00→ 捕获22x Burgers $4.00→ 捕获22X Burgers $4.00→ 捕获22- Burgers $4.00→ 捕获22 - Burgers $4.00→ 捕获2
使用提示
在实际使用时,你只需要提取正则的第一个捕获组的值,就是你要的数量数字。比如在Python中可以这样用:
import re regex = r"^(\d{1,2})(?:\s?[xX-]\s?)?" test_cases = [ "2 Burgers $4.00", "2 x Burgers $4.00", "2 X Burgers $4.00", "2x Burgers $4.00", "2X Burgers $4.00", "2- Burgers $4.00", "2 - Burgers $4.00" ] for case in test_cases: match = re.match(regex, case) if match: print(f"匹配到数量: {match.group(1)}")
内容的提问来源于stack exchange,提问作者Wrumble




