如何让pyparsing匹配“1天”或“2天”但失败“1天”和“2天”?

问题描述 投票:0回答:1

我正在尝试匹配“3 天后”或“1 个月后”形式的句子片段。我想特别注意单数和复数形式,所以“1 day”有效,但“1 days”无效。

我有以下代码,该代码几乎已经存在,但故障测试中的前两个条目不会失败。任何建议请使用我想要的语法符号,如果可能的话,以避免使用 set_parse_action() 根据单位的复数检查数值。

from pyparsing import *

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

single = Literal('1') + unit
multi = Word(nums) + 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')
python pyparsing
1个回答
0
投票

只有案例

after 1 days
在应该失败的时候通过了,其他三个案例都按预期失败了。

问题是检查

multi = Word(nums) + units
使用
nums
其中包括 1,所以即使你的单数变体不起作用,这个也可以。我查了一下 nums 是如何定义的,显然它是
nums = '0123456789'
(参见here)。因此,您删除了 1。这对我有用:

...
multi_nums = '023456789'  # nums excluding 1

single = Literal('1') + unit
multi = Word(multi_nums) + units
...
© www.soinside.com 2019 - 2024. All rights reserved.