Python/PyParsing:setResultsName 遇到困难

发布于 2024-09-03 16:49:35 字数 841 浏览 5 评论 0原文

我认为我在调用 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() 仅适用于终端吗?

I think I'm making a mistake in how I call 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

From IDLE:

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

The output I hope for:

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

Does setResultsName() only work for terminals?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

时间海 2024-09-10 16:49:35

如果您将 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")。这是我上面所做的另一种方法。

If you change the definition of course to

course = (DEPT_CODE + COURSE_NUMBER).setResultsName("Course")

you get the following behavior:

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]

That's not exactly the repr you wanted, but does it suffice?

Note, from the docs:

[setResultsName] returns a copy of
the original ParserElement object;
this is so that the client can define
a basic element, such as an integer,
and reference it in multiple places
with different names.

So course.setResultsName("Course") does not work because it doesn't affect course. You would instead have to say course=course.setResultsName("Course"). That's an alternative way to do what I did above.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文