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

如何让pyparsing匹配正确单复数时间表述,拒绝错误形式?

问题分析

你的代码无法拦截“after 1 days”和“after 2 day”这两个错误用例,核心原因是multi规则接受任意数字(包括1)+ 复数单位,导致“1 days”会被multi错误匹配成功;而“2 day”虽不匹配任何规则,但原代码的逻辑漏洞让错误用例未被正确识别。

解决方案

要在不使用set_parse_action()的前提下实现单复数严格匹配,需限制multi规则中的数字为非1的正整数。通过正则表达式可直接完成这一限制:

  • [2-9]\d*:匹配以2-9开头的数字(如2、3、20等)
  • 1\d+:匹配以1开头且后续至少有一位数字的数(如10、11、100等)
    两者结合可覆盖所有不等于1的正整数。

修改后的代码如下:

from pyparsing import *

units = Keyword('days') ^ Keyword('months')
unit = Keyword('day') ^ Keyword('month')

# 匹配1 + 单数单位
single = Literal('1') + unit
# 匹配非1的数字 + 复数单位
multi = Regex(r'[2-9]\d*|1\d+') + units

after = Keyword('after') + (single ^ multi)

# 成功测试
a = after.run_tests('''
    after 1 day
    after 2 days
    after 1 month
    after 2 months
    ''')

print('=============')

# 失败测试
b = after.run_tests('''
    after 1 days
    after 2 day
    after 1day
    after 2days
    ''', failure_tests=True)

print('Success tests', 'passed' if a[0] else 'failed')
print('Failure tests', 'passed' if b[0] else 'failed')
效果验证

运行修改后的代码:

  • 所有合法用例(如after 1 day、after 2 days)会正常通过
  • 错误用例均被正确拦截:
    • after 1 days:既不匹配single(单位为复数)也不匹配multi(数字为1,不符合正则)
    • after 2 day:既不匹配single(数字非1)也不匹配multi(单位为单数)
    • after 1day、after 2days:因数字与单位无空格,不符合规则匹配逻辑

内容的提问来源于stack exchange,提问作者BruceH

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 20:20:53