2

簡単な文があります - " tok0,084040,tok1,tok2,231108 " ここで、084040は時刻 (08:40:40) で、231108は日付 (23.11.2008) です。

pyparsing documentation に従って、トークンを解析するためのルールを作成しました。

    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)
私が望むのは、グループにsetParseActionsetResultsNameを使用できるように、 ParseResultsにtime_tokendate_tokenで構成される論理グループを作成することです。それらが隣接していないと考える ようなもの。 PS: grammar.parseString の結果は、ParseResults のインスタンスである必要があります。
Group(time_token + date_token)
dreamGroup = Group(time_token + date_token)("datetime").setParseAction(myFn)
parseResults = grammar.parseString("123,084040,ABC,A,231108")
datetime = parseResults.datetime

4

2 に答える 2

3

解析アクションの本文に結果名を追加すると、解析されたトークンに残ります。

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 の datetime オブジェクトを構築して、代わりにそれを返すことができます。

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 の datetime オブジェクトのデフォルトの文字列表現です。

于 2013-08-20T23:27:00.303 に答える
1

文法レベルで parseResults を変更すると、問題が解決しました。だから私はあなたの答えを少し和らげました、そしてそれは魅力のように働きました。


def changeGrammarParseResults(s, loc, toks):
    toks['datetime_8601'] = datetime.datetime(
        toks.pop('year'), toks.pop('month'), toks.pop('day'),
        toks.pop('hour'), toks.pop('minute'), toks.pop('second'),
        tzinfo=pytz.utc).isoformat()
于 2013-08-21T06:32:54.003 に答える