2010-05-30 2 views
3

Я думаю, что я делаю ошибку в том, как я называю setResultsName():Python/Pyparsing: Трудности с 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() работает только для терминалов?

ответ

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 вы хотели, но это хватает?

Примечание, from the docs:

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

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

+0

Что делает 'repr()' do? –

+0

Кроме того, похоже, что 'setResultsName()' возвращает копию, но 'setParseAction()' does not - почему непоследовательность? Или я ошибаюсь? –

+0

@Rosarch: 'repr()' возвращает строковое представление объекта. Он часто дает более полное представление о данных внутри объекта, чем 'str()'. Я думаю, вы правы, что 'setParseAction' возвращает' self', а 'setResultName' возвращает копию. Я недостаточно осведомлен, чтобы объяснить, почему так. – unutbu

Смежные вопросы