3

呼び出し方を間違えていると思いますsetResultsName()

from pyparsing import *

DEPT_CODE = Regex(r'[A-Z]{2,}').setResultsName("Dept Code")
COURSE_NUMBER = Regex(r'[0-9]{4}').setResultsName("Course Number")

COURSE_NUMBER.setParseAction(lambda s, l, toks : int(toks[0]))

course = DEPT_CODE + COURSE_NUMBER

course.setResultsName("course")

statement = course

アイドルから:

>>> myparser import *
>>> statement.parseString("CS 2110")
(['CS', 2110], {'Dept Code': [('CS', 0)], 'Course Number': [(2110, 1)]})

私が望む出力:

>>> myparser import *
>>> statement.parseString("CS 2110")
(['CS', 2110], {'Course': ['CS', 2110], 'Dept Code': [('CS', 0)], 'Course Number': [(2110, 1)]})

setResultsName()端末でのみ機能しますか?

4

1 に答える 1

5

の定義をcourseに変更すると

course = (DEPT_CODE + COURSE_NUMBER).setResultsName("Course")

次の動作が得られます。

x=statement.parseString("CS 2110")
print(repr(x))
# (['CS', 2110], {'Course': [((['CS', 2110], {'Dept Code': [('CS', 0)], 'Course Number': [(2110, 1)]}), 0)], 'Dept Code': [('CS', 0)], 'Course Number': [(2110, 1)]})
print(x['Dept Code'])
# CS
print(x['Course Number'])
# 2110
print(x['Course'])
# ['CS', 2110]

それはまさにreprあなたが望んでいたものではありませんが、それで十分ですか?

ドキュメントからの注意:

[setResultsName] は元の ParserElement オブジェクトのコピーを返します。これは、クライアントが整数などの基本要素を定義し、それを複数の場所で異なる名前で参照できるようにするためです。

影響しないのでcourse.setResultsName("Course")動作しませんcourse。代わりに と言わなければなりませんcourse=course.setResultsName("Course")。これは、私が上で行ったことを行う別の方法です。

于 2010-05-30T20:46:45.917 に答える