pyparsing:命名结果?

时间:2015-07-28 22:02:39

标签: python parsing pyparsing

我正在编写一个解析器来解析数学表达式,其中包含变量等。我想要一个所有捕获变量的列表。但我只获得最后捕获的变量。以下是显示问题的最小示例。

    >>> from pyparsing import *
    >>> var = Word(alphas)
    >>> expr = Forward()
    >>> expr << var('var') + ZeroOrMore(Literal('+') + expr)
    >>> foo = expr.parseString("x + y + z")
    >>> foo
    (['x', '+', 'y', '+', 'z'], {'var': [('x', 0), ('y', 2), ('z', 4)]})
    >>> foo['var']
    'z'

我期待[&#39; x&#39;,&#39; y&#39;,&#39; z&#39;]。我正在使用pyparsing 2.1版。

1 个答案:

答案 0 :(得分:4)

默认情况下,命名结果仅捕获最后一项。如果使用显式setResultsName方法调用,则可以通过添加可选的listAllMatches=True参数来获取所有项目。由于您使用的是快捷方式var('var'),因此如果您使用'*'结束结果名称,则可以获得listAllMatches行为:

expr << var('var*') + ZeroOrMore(Literal('+') + expr)

我更喜欢使用dump()方法从解析结果中列出正文和名称:

>>> foo = expr.parseString("x + y + z")
>>> foo.var
(['x', 'y', 'z'], {})
>>> print foo.dump()
['x', '+', 'y', '+', 'z']
- var: ['x', 'y', 'z']

顺便说一句,因为您已经以这种方式定义了语法,所以您的操作将从右向左进行评估。如果你只评估加法就可以了,但从右到左做“3 - 5 + 2”会给你-4,当你得到0时。看看使用infixNotation(原名{{1}定义和评估算术和布尔表达式。在pyparsing.wikispaces.com上的pyparsing wiki上也有几个例子。