我正在使用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'。
答案 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符号层次结构(并可能会重新跟踪该过程中的某些解析步骤)。