我正在尝试匹配“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')
只有案例
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
...