1

我一直在使用 pyparsing 开发 DSL。

我有几个关键词。pyparsing 关键字类的文档位于http://packages.python.org/pyparsing/pyparsing.pyparsing.Keyword-class.html

我将它们定义为

this = Keyword("this", caseless=cl)
that = Keyword("that", caseless=cl)

我有一本字典,上面的关键字翻译成数字:

helper_dict = {"this":-1, "that":1}

我面临的问题是我无法为它们获得一致的字符串表示。当我尝试 str(this) 时,它带有引号。所以我不能在没有关键错误的情况下真正使用字典。我的意思是KeyError,当我尝试以下任何一项时,我会得到一个:

helper_dict[this]
helper_dict[this.__str__()]
helper_dict[str(this)]

如何获得正确的字符串表示

我查看了关键字的文档和关键字的超类,但我无法弄清楚实际上应该执行此操作的函数。

4

1 回答 1

0

this并且that不是字符串,它们是使用字符串定义的 pyparsing 表达式,但它们不是字符串。至于helper_dict,您已经使用字符串“this”和“that”定义了键。在它们解析了一些包含其定义输入字符串的输入后,您将从thisand表达式中获取字符串。that

这是一些控制台实验,向您展示这是如何工作的:

>>> from pyparsing import *
>>> this = Keyword("this", caseless=True)
>>> that = Keyword("that", caseless=True)
>>> result = (this|that).parseString("This")
>>> print result
['this']

请注意,无论输入字符串的大小写如何,Keyword 始终以大写/小写形式返回一致的标记。CaselessLiteral 和 caseless Keyword 总是在其定义字符串的情况下返回标记,而不是输入字符串的情况。

>>> print result[0]
this
>>> print type(result[0])
<type 'str'>

解析后的数据在 ParseResults 对象中返回,该对象支持列表、字典和对象式寻址。这里的第 0 个元素是一个字符串,字符串“this”。您可以使用此字符串来匹配在 helper_dict 中定义的键“this”:

>>> helper_dict = {"this":1, "that":-1}
>>> helper_dict[result[0]]
1

或者定义一个解析动作来在解析时为你做这个替换(replaceWith 是 pyparsing 中定义的一个辅助方法:

>>> this.setParseAction(replaceWith(1))
"this"
>>> print (this | that).parseString("This")[0]
1

——保罗

于 2012-10-31T18:52:19.513 回答