pyparsing:命名结果?
pyparsing: named results?
我正在编写一个解析器来解析数学表达式,其中包含变量等。我想要所有捕获变量的列表。但我只得到最后捕获的变量。下面是一个显示问题的最小示例。
>>> 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
) 来定义和评估算术和布尔表达式。在 pyparsing.wikispaces.com.
的 pyparsing wiki 上还有几个示例可用
我正在编写一个解析器来解析数学表达式,其中包含变量等。我想要所有捕获变量的列表。但我只得到最后捕获的变量。下面是一个显示问题的最小示例。
>>> 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
) 来定义和评估算术和布尔表达式。在 pyparsing.wikispaces.com.