我正在编写一个解析器来解析数学表达式,其中包含变量等。我想要一个所有捕获变量的列表。但我只获得最后捕获的变量。以下是显示问题的最小示例。
>>> 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版。
答案 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上也有几个例子。