Pyparsing getName()返回错误的名称

时间:2019-06-27 05:16:55

标签: python pyparsing

我正在使用ebp+8和中缀数学运算符解析字符串。解析本身似乎可以正常工作,但是dotted.strings返回的名称不是我期望的。

getName

现在对其进行测试...

from pyparsing import (Word, alphas, opAssoc, infixNotation, 
                       Suppress, Group, delimitedList, oneOf)
LPAR, RPAR = map(Suppress, "()")

chars = Word(alphas + "_")
colstr = Group(delimitedList(chars, delim=".")).setResultsName("colstr*")
infix_expr = infixNotation(colstr, [
    ("-", 1, opAssoc.RIGHT),
    (oneOf("* /"), 2, opAssoc.LEFT),
    (oneOf("+ -"), 2, opAssoc.LEFT),
])("infix")

这是我所期望的,但是>>> infix_ex = infix_expr.parseString('a.b + x.y') >>> print(infix_ex.dump()) [[['a', 'b'], '+', ['x', 'y']]] - infix: [['a', 'b'], '+', ['x', 'y']] - colstr: [['a', 'b'], ['x', 'y']] [0]: ['a', 'b'] [1]: ['x', 'y'] 似乎从错误的解析树级别返回了名称。

getName

如您所见,>>> infix_ex.getName() 'infix' >>> infix_ex[0].getName() 'colstr' >>> infix_ex[0].asList() [['a', 'b'], '+', ['x', 'y']] 为树的根级返回'infix',为树的'infix'级返回'colstr'。

1 个答案:

答案 0 :(得分:0)

这几乎是不可避免的,因为getName()是在ParseResults上定义的方法,而不是在匹配的令牌(可以是字符串,因此不支持getName())上定义的方法

以下是ParseResults.getName文档字符串中的示例:

    integer = Word(nums)
    ssn_expr = Regex(r"\d\d\d-\d\d-\d\d\d\d")
    house_number_expr = Suppress('#') + Word(nums, alphanums)
    user_data = (Group(house_number_expr)("house_number")
                | Group(ssn_expr)("ssn")
                | Group(integer)("age"))
    user_info = OneOrMore(user_data)

    result = user_info.parseString("22 111-22-3333 #221B")
    print(result.asList())
    for item in result:
        print(item.getName(), ':', item[0])

哪些印刷品:

[['22'], ['111-22-3333'], ['221B']]
age : 22
ssn : 111-22-3333
house_number : 221B

请注意,要使用getName(),每个命名位都必须是Group,并且该名称应在容器上,而不是直接在匹配的令牌上。

可以在不是Group的元素上定义结果名称,然后直接访问它们而不必获取第[0]元素,但是您将无法给他们打电话getName()

如果您打算使用getName()来遍历使用infixNotation进行解析所返回的结构,建议您改为为自己的操作数和infix表示法中的每个优先级定义自己的容器类语法。请参阅simple_bool.py示例代码,以了解如何完成此操作。这样,您将可以更直接地控制从pyparsing传递回给您的对象,而不是尝试遍历已解析的infix符号层次结构(并可能会重新跟踪该过程中的某些解析步骤)。