2010-05-30 86 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