如何正确为PyParsing的ParseResults命名?
Pyparsing中命名与分组的优先级逻辑
这不是操作错误,是你对setName和Group的作用层级理解有偏差,两者的顺序直接决定了命名会绑定到哪个解析层级上。
单个标识符场景的逻辑
用代码直观展示你提到的单个标识符案例:
from pyparsing import Word, alphas, Group I = Word(alphas) # 先命名再分组:gid gid = I.setName("id").Group() result_gid = gid.parse_string("test") print(result_gid.as_dict()) # 输出 {} # 原因:setName给原始的I命名了,但Group把I包成了一个未命名的顶层子结果,as_dict()只提取顶层的命名项,内部的"id"被嵌套在子结果里,无法直接拿到 # 先分组再命名:idg idg = Group(I).setName("id") result_idg = idg.parse_string("test") print(result_idg.as_dict()) # 输出 {'id': 'test'} # 原因:setName直接绑定到了顶层的Group上,这个Group就是as_dict()能识别的命名项,自然能拿到对应值
序列场景的反向逻辑
再看序列(比如OneOrMore)的情况:
from pyparsing import OneOrMore # 先命名再分组,再放入序列 seq_gid = OneOrMore(I.setName("id").Group()) result_seq_gid = seq_gid.parse_string("a b c") print(result_seq_gid.as_dict()) # 输出 {'id': ['a', 'b', 'c']} # 原因:每个I都被命名为"id",分组仅打包子结果不影响命名层级,OneOrMore会收集所有同名的"id"项,最终合并成列表存入as_dict() # 先分组再命名,再放入序列 seq_idg = OneOrMore(Group(I).setName("id")) result_seq_idg = seq_idg.parse_string("a b c") print(result_seq_idg.as_dict()) # 输出 {} # 原因:每个Group被命名为"id",但这些Group被包裹在未命名的OneOrMore列表里,as_dict()只识别顶层的命名项,而OneOrMore本身没有命名,所以无法提取内部的"id"
核心规则总结
setName是给当前调用它的解析元素绑定名称,元素所在层级决定了它是否会出现在as_dict()的顶层键中。Group的作用是将内部解析结果打包成子ParseResults对象,它本身是独立的解析元素。- 如果你想让名称出现在
as_dict()顶层:- 单个元素:给包裹它的
Group(或直接给元素本身,无需分组时)命名。 - 序列元素:给序列中的子元素命名,让序列收集所有同名子元素并合并为列表。
- 单个元素:给包裹它的
内容的提问来源于stack exchange,提问作者Alex A.
相关产品推荐
相关产品推荐

