Pyparsing返回的getName()名称错误

2024-09-27 07:35:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用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']]

如您所见,getName对于根级别返回'infix',对于树的'infix'级别返回'colstr'。你知道吗


Tags: 名称group级别exwordsuppressgetnamechars
1条回答
网友
1楼 · 发布于 2024-09-27 07:35:53

这几乎是不可避免的,因为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解析返回的结构,我建议您为中缀符号语法中的操作数和每个优先级定义自己的容器类。请参阅simple_bool.py示例代码以了解如何做到这一点。这样,您就可以更直接地控制pyparsing返回给您的对象,而不是试图通过解析的中缀表示法层次结构(并且可能在这个过程中重新跟踪一些解析步骤)。你知道吗

相关问题 更多 >

    热门问题