You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

求助:使用正则表达式提取收据OCR文本行首的整数数量

解决收据行首数量的正则匹配问题

没问题,我来帮你搞定这个正则表达式的需求!根据你列出的所有场景,我们需要匹配行首的1-2位整数,同时兼容后面可能跟着的x/X(带/不带空格)、-(带/不带空格)这些分隔符,甚至没有分隔符直接跟物品名的情况。

最终正则表达式

^(\d{1,2})(?:\s?[xX-]\s?)?

正则逻辑拆解

咱们来逐个部分解释,让你明白为什么它能覆盖所有场景:

  • ^:强制匹配行首,确保我们抓取的是每一行开头的数量,不会误匹配中间的数字
  • (\d{1,2}):捕获1到2位的整数(和你之前的逻辑一致,适合收据里的数量范围),这就是我们要提取的目标数字
  • (?:\s?[xX-]\s?)?:这是一个非捕获组(?:开头),用来匹配可选的分隔符:
    • \s?:匹配0个或1个空格,兼容分隔符前后有无空格的情况
    • [xX-]:匹配xX或者-这三种分隔符
    • ?:整个分隔符组是可选的,也就是说数字后面可以直接跟物品名(比如2 Burgers这种场景)

场景验证

用这个正则测试你列出的所有案例,都能正确捕获到数字2

  • 2 Burgers $4.00 → 捕获2
  • 2 x Burgers $4.00 → 捕获2
  • 2 X Burgers $4.00 → 捕获2
  • 2x Burgers $4.00 → 捕获2
  • 2X Burgers $4.00 → 捕获2
  • 2- Burgers $4.00 → 捕获2
  • 2 - 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

火山引擎 最新活动