You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用pyparsing转换解析结果集为字典时仅保留最后一条数据的问题

解决pyparsing转换字典仅保留最后一条数据的问题

我尝试使用pyparsing将解析结果集转换为字典,但生成的字典仅包含结果集中的最后一条数据,而非全部内容。请问我遗漏了什么?

使用的pyparsing版本:3.0.9

我的代码

from pyparsing import *

test = """
pci24 u2480-L0
fcs1 g4045-L1
pci25 h6045-L0
en192 v7024-L3
pci26 h6045-L1
"""

grammar_pci = Combine("pci" + Word( nums )).setResultsName("name") + Word( alphanums + "-" ).setResultsName("loc")
grammar_non_pci = Suppress( Regex( r"(?!pci).*" ) )

grammar = OneOrMore( Group(grammar_pci).setResultsName("pci_slots") | grammar_non_pci, stopOn=StringEnd())

def main():
  data = grammar.parse_string(test, parseAll=True)
  print(data)
  data_dict = data.as_dict()
  print(data_dict)

if __name__ == "__main__":
    main()

解析结果与字典输出

[['pci24', 'u2480-L0'], ['pci25', 'h6045-L0'], ['pci26', 'h6045-L1']]
{'pci_slots': {'name': 'pci26', 'loc': 'h6045-L1'}}

问题原因与解决方案

问题出在setResultsName("pci_slots")的默认行为:当多次匹配到同名结果时,pyparsing会自动用最新结果覆盖之前的,最终只保留最后一条匹配数据。

要保留所有匹配结果,有两种简便解决方式:

  1. 添加listAllMatches=True参数
    修改语法定义时,给setResultsName加上该参数,明确要求保留所有匹配项:

    grammar = OneOrMore( Group(grammar_pci).setResultsName("pci_slots", listAllMatches=True) | grammar_non_pci, stopOn=StringEnd())
    
  2. 使用带星号的结果名(pyparsing 3.x特性)
    直接在结果名称后加*,pyparsing会自动将所有匹配项收集为列表:

    grammar = OneOrMore( Group(grammar_pci).setResultsName("pci_slots*") | grammar_non_pci, stopOn=StringEnd())
    

修改后运行代码,得到的字典会包含全部匹配数据:

{'pci_slots': [{'name': 'pci24', 'loc': 'u2480-L0'}, {'name': 'pci25', 'loc': 'h6045-L0'}, {'name': 'pci26', 'loc': 'h6045-L1'}]}

内容的提问来源于stack exchange,提问作者Jai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 13:31:05