gpt4 book ai didi

python - 如何使用 pyparsing 对放置在不同位置的 token 进行分组?

转载 作者:行者123 更新时间:2023-11-28 22:54:12 25 4
gpt4 key购买 nike

我有一个简单的句子 - “tok0,084040,tok1,tok2,231108”,其中 084040 是时间 (08:40:40),231108 是日期 (23.11.2008)

根据 pyparsing 文档,我编写了解析标记的规则:

    from pyparsing import *
d = Literal(',').suppress()
two_digits = Word(nums, exact=2)
tok0 = Word(nums)
time_token = two_digits("hour") + two_digits("min") + two_digits("sec")
tok1 = Word(alphas)
tok2 = oneOf('A B C')
date_token = two_digits("day") + two_digits("month") + two_digits("year")
grammar = (tok0 + d + time_token + d + tok1 + d + tok2 + d + date_token)
我想要的是在我的 ParseResults 中有一个逻辑组,由 time_tokendate_token 组成,这样我就可以使用 setParseAction, setResultsName 为组。类似于 <pre>Group(time_token + date_token)</pre>考虑到它们不相邻。 <pre>dreamGroup = Group(time_token + date_token)("datetime").setParseAction(myFn)
parseResults = grammar.parseString("123,084040,ABC,A,231108")
datetime = parseResults.datetime</pre>
P.S.: grammar.parseString 的结果应该是 ParseResults 的一个实例。

最佳答案

您可以在解析操作的主体中添加结果名称,它们将保留在已解析的标记中。

def addDateTimeResults(tokens):
tokens['date'] = ('20'+tokens.year, tokens.month, tokens.day)
tokens['time'] = (tokens.hour, tokens.min, tokens.sec)
tokens['datetime'] = ParseResults([tokens.date, tokens.time])
for name in ('date', 'time'):
tokens['datetime'][name] = tokens[name]
grammar.setParseAction(addDateTimeResults)

现在在您的示例代码中,添加对 dump() 的调用以查看您得到了什么:

parseResults = grammar.parseString("123,084040,ABC,A,231108")
datetime = parseResults.datetime
print datetime.dump()

你得到:

[('2008', '11', '23'), ('08', '40', '40')]
- date: ('2008', '11', '23')
- time: ('08', '40', '40')

或者不是插入和返回元组,而是构造一个实际的 Python 日期时间对象,然后返回它:

import datetime
def addDateTimeResults(tokens):
dtfields = map(int, (tokens[fld] for fld in "year month day hour min sec".split()))
# adjust 2-digit year for 21st century
dtfields[0] += 2000
tokens['datetime'] = datetime.datetime(*dtfields)

现在 print parseResults.datetime 给出:

2008-11-23 08:40:40

这是 Python 日期时间对象的默认字符串表示形式。

关于python - 如何使用 pyparsing 对放置在不同位置的 token 进行分组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18330592/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com