我正在try 匹配"3天后"或"1个月后"形式的句子片段.我想特别对待单数和复数形式,所以"1天"有效,但"1天"无效.

我有下面的代码,它几乎就在那里,但失败测试中的前两个条目不会失败.如果可能的话,请按照我的意愿使用语法符号来避免使用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')

推荐答案

只有 case after 1 days在应该失败的情况下通过,其他三个 case 按预期失败.

问题是判断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
...

EDIT:
The above fails for double digits including 1, see comments. Fixed version as per comments:

single = Literal('1') + unit
multi = ~Keyword('1') + Word(nums) + units

Python相关问答推荐

单击Cookie横幅错误并在Selenium中启用搜索栏

当pip为学校作业(job)安装sourcefender时,我没有收到匹配的分发错误.我已经try 过Python 3.8.10和3.10.11

为什么基于条件的过滤会导致pandas中的空数据框架?

无法使用python.h文件; Python嵌入错误

在Pandas框架中截短至固定数量的列

Python:在类对象内的字典中更改所有键的索引,而不是仅更改一个键

使用FASTCGI在IIS上运行Django频道

根据不同列的值在收件箱中移动数据

标题:如何在Python中使用嵌套饼图可视化分层数据?

用Python解密Java加密文件

在Wayland上使用setCellWidget时,try 编辑QTable Widget中的单元格时,PyQt 6崩溃

log 1 p numpy的意外行为

将pandas Dataframe转换为3D numpy矩阵

所有列的滚动标准差,忽略NaN

为什么NumPy的向量化计算在将向量存储为类属性时较慢?'

移动条情节旁边的半小提琴情节在海运

无法在Docker内部运行Python的Matlab SDK模块,但本地没有问题

Asyncio:如何从子进程中读取stdout?

如何在turtle中不使用write()来绘制填充字母(例如OEG)

考虑到同一天和前2天的前2个数值,如何估算电力时间序列数据中的缺失值?