Python/PyParsing:setResultsName难度大

Nic*_*ner 3 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
Run Code Online (Sandbox Code Playgroud)

来自IDLE:

>>> myparser import *
>>> statement.parseString("CS 2110")
(['CS', 2110], {'Dept Code': [('CS', 0)], 'Course Number': [(2110, 1)]})
Run Code Online (Sandbox Code Playgroud)

我希望的输出:

>>> myparser import *
>>> statement.parseString("CS 2110")
(['CS', 2110], {'Course': ['CS', 2110], 'Dept Code': [('CS', 0)], 'Course Number': [(2110, 1)]})
Run Code Online (Sandbox Code Playgroud)

难道setResultsName()只为终端的工作吗?

unu*_*tbu 5

如果更改的定义course

course = (DEPT_CODE + COURSE_NUMBER).setResultsName("Course")
Run Code Online (Sandbox Code Playgroud)

你会得到以下行为:

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]
Run Code Online (Sandbox Code Playgroud)

这不完全是repr你想要的,但它就足够了吗?

请注意,来自文档:

[setResultsName]返回原始ParserElement对象的副本 ; 这样客户端就可以定义一个基本元素,例如一个整数,并在具有不同名称的多个位置引用它.

所以course.setResultsName("Course")不起作用,因为它不会影响course.你不得不说course=course.setResultsName("Course").这是我做上面做的另一种方式.