Python / PyParsing:setResultsName难度大

时间:2010-05-30 20:24:01

标签: python nlp 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()仅适用于终端吗?

1 个答案:

答案 0 :(得分: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")。这是我做上面做的另一种方式。