Tim*_*ima 5 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'
Run Code Online (Sandbox Code Playgroud)
我期待着['x','y','z']。我正在使用pyparsing 2.1版。
默认情况下,命名结果仅捕获最后一项。如果使用显式setResultsName方法调用,则可以通过添加可选listAllMatches=True参数来获取所有项。由于您使用的是快捷方式 form var('var'),如果结果名称以“*”结尾,您可以获得 listAllMatches 行为:
expr << var('var*') + ZeroOrMore(Literal('+') + expr)
Run Code Online (Sandbox Code Playgroud)
我更喜欢使用该dump()方法从解析结果中列出正文和名称:
>>> foo = expr.parseString("x + y + z")
>>> foo.var
(['x', 'y', 'z'], {})
>>> print foo.dump()
['x', '+', 'y', '+', 'z']
- var: ['x', 'y', 'z']
Run Code Online (Sandbox Code Playgroud)
顺便说一下,因为你已经用这种方式定义了你的语法,你的操作将从右到左进行评估。如果您只计算加法,这将没问题,但是从右到左执行“3 - 5 + 2”会给您 -4,当您应该得到 0 时。考虑使用infixNotation(以前名为operatorPrecedence)来定义和计算算术和布尔值表达式。在 pyparsing.wikispaces.com 上的 pyparsing wiki 上也有几个示例。