Python / PyParsing: трудности с setResultsName - PullRequest
3 голосов
/ 31 мая 2010

Я думаю, что я делаю ошибку в том, как я звоню 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

От IDLE:

>>> 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() только для терминалов?

1 Ответ

5 голосов
/ 31 мая 2010

Если вы измените определение 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]

Это не совсем то, что вы хотели, но достаточно ли этого?

Примечание, из документов :

[setResultsName] возвращает копию из исходный объект ParserElement; это так, что клиент может определить базовый элемент, такой как целое число, и ссылаться на него в нескольких местах с разными именами.

Так что course.setResultsName("Course") не работает, потому что не влияет на course. Вместо этого вам нужно будет сказать course=course.setResultsName("Course"). Это альтернативный способ сделать то, что я делал выше.

...