python - pyparsing:命名结果?

标签 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'

我期待 ['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/

相关文章:

Pyparsing - 名称不以字符开头

python - pulp solve 函数给出相同的输出

python - 字典中列表的联合

python - 在 Python 中合并 2 个排序列表的有效解决方案

parsing - 将 yaml 字段动态解析为 Go 中的一组有限结构之一

python - 使用 Python 混合 RSS 提要的好方法是什么?

c# - HTML 解析 c#

python - 在展平参数张量上使用 tf.gradients 或 tf.hessians

python - 如何使用 pyparsing 解析缩进和缩进?

python - Pyparsing SetParseAction 问题