我正在编写一个解析器来解析数学表达式,其中包含变量等。我想要所有捕获变量的列表。但我只得到最后捕获的变量。下面是一个显示问题的最小示例。
>>> 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'
我期待 ['x', 'y', 'z']。我正在使用 pyparsing 2.1 版。
最佳答案
默认情况下,命名结果仅捕获最后一项。如果使用显式 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
(以前命名为operatorPrecedence
) 来定义和评估算术和 bool 表达式。 pyparsing.wikispaces.com 上的 pyparsing wiki 上也提供了几个示例。
关于python - pyparsing:命名结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31687909/