2010-05-30 44 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對象; 這是這樣的,客戶端可以定義一個基本元素,如一個整數, ,並在多個地方 用不同的名稱引用它。

因此course.setResultsName("Course")不起作用,因爲它不會影響course。你將不得不說,course=course.setResultsName("Course")。這是做我上面所做的一個替代方法。

+0

'repr()'做了什麼? – 2010-05-30 21:27:06

+0

此外,看起來'setResultsName()'返回一個副本,但'setParseAction()'不 - 爲什麼不一致?還是我誤會了? – 2010-05-30 21:29:15

+0

@Rosarch:'repr()'返回對象的字符串表示。它通常比'str()'更能提供對象內數據的更完整視圖。我認爲你是對的,'setParseAction'返回'self',而'setResultName'返回一個副本。我沒有足夠的知識來解釋爲什麼這樣。 – unutbu 2010-05-31 02:21:51