如何用Pyparsing实现嵌套Python列表的解析器?
使用Pyparsing解析嵌套花括号结构
问题分析
你当前代码的问题在于:
- 直接用
delimited_list包裹Word(nums)和nested_expr,未正确处理外层花括号,也没将数字字符串转换为整数 nested_expr默认会把内部内容当作整体字符串,未拆分逗号分隔的元素
正确实现方案
我们需要定义递归解析规则,同时添加转换动作将字符串数字转为整数:
import pyparsing as pp # 定义整数解析器,添加转换动作转为int类型 integer = pp.Word(pp.nums).set_parse_action(lambda t: int(t[0])) # 递归定义元素:可以是整数,或者嵌套的花括号结构 element = pp.Forward() # 嵌套结构:{ 逗号分隔的元素列表 },用Suppress去除解析结果中的{} nested_struct = pp.Suppress("{") + pp.delimited_list(element) + pp.Suppress("}") # 给element赋值,支持递归嵌套 element << (integer | nested_struct) # 解析测试输入 result = element.parse_string("{1,2,3,{4,5}}", parse_all=True).as_list() print(result) # 输出: [1, 2, 3, [4, 5]]
代码解释
integer:匹配数字字符串,通过set_parse_action自动转换为Python整数element = pp.Forward():声明前向引用,为递归嵌套结构做准备nested_struct:定义花括号包裹的结构,内部是逗号分隔的element列表,用Suppress过滤掉不需要保留的{和}element << (integer | nested_struct):完成递归规则定义,让元素既可以是整数,也可以是嵌套的花括号结构parse_all=True:确保整个输入字符串被完整解析,避免残留未解析内容
内容的提问来源于stack exchange,提问作者Sergej Herbert
相关产品推荐
相关产品推荐

