Python/PyParsing: 使用setResultsName遇到困难

3 投票
1 回答
1166 浏览
提问于 2025-04-15 23:21

我觉得我在调用 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 个回答

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,但这样可以吗?

注意,根据文档

[setResultsName] 返回的是原始 ParserElement 对象的一个 副本;这样做是为了让用户可以定义一个基本元素,比如整数,并且可以在多个地方用不同的名字来引用它。

所以 course.setResultsName("Course") 这个方法不起作用,因为它并没有改变 course 本身。你需要这样写 course=course.setResultsName("Course")。这是一种替代的方法来实现我上面所做的事情。

撰写回答