如何用pyparsing正确定义嵌套花括号包裹的空格分隔值列表?
Pyparsing嵌套列表语法错误原因解析
我们来逐个分析前两种写法的问题,以及正确写法为什么能正常工作:
第一种写法的核心错误
代码:
import pyparsing as pp SingleValue = pp.Word(pp.alphas) # Single values are strings of letters ListOfValues = pp.Forward() # To be defined later Values = SingleValue ^ ('{' + ListOfValues + '}') # Values are either words or braces-enclosed lists ListOfValues <<= pp.delimited_list(Values, delim=' ') # The lists inside the braces are space-separated values. print(ListOfValues.parse_string('{aaa bbb {ccc ddd}}'))
问题出在对ListOfValues的定义完全不符合输入结构:
- 你要解析的输入是
{aaa bbb {ccc ddd}},也就是外层带花括号的集合,但这里ListOfValues被定义成了pp.delimited_list(Values, delim=' ')——这只是花括号内部的“空格分隔元素序列”,完全没包含外层的{}。 - 当解析器处理输入开头的
{时,ListOfValues的规则里根本没有匹配{的逻辑,直接去找Values类型(要么是字母单词,要么是带花括号的ListOfValues),自然匹配失败,报错找不到预期的Values,反而看到aaa后的bbb就触发了异常。
简单说:你把“花括号包裹的整个集合”和“集合内部的元素列表”搞混了,解析入口的规则和输入格式不匹配。
第二种写法的问题
调整后的代码:
Values = SingleValue ^ ListOfValues ListOfValues <<= '{' + pp.delimited_list(Values, delim=' ') + '}'
这里有两个致命问题:
- 错误使用
^(优先选择符)而非|(匹配符):^的逻辑是“优先尝试左边的表达式,匹配成功就不再尝试右边”,而不是“匹配任意符合条件的表达式”。在递归场景下,这会导致解析器优先匹配SingleValue,而不会主动尝试递归匹配ListOfValues,打破了嵌套结构的解析逻辑。 delimited_list的匹配逻辑冲突:
当解析{aaa bbb ...}时,解析器匹配完{和第一个aaa(SingleValue)后,会尝试匹配空格+下一个Values。但因为^的优先级,解析器认为下一个元素应该要么是SingleValue,要么是ListOfValues(带{}),但此时遇到的是bbb,解析器错误地判断应该已经到了列表结束的}位置,所以抛出“Expected '}' found 'bbb'”的异常。
正确写法的关键修正
SingleValue = pp.Word(pp.alphas) # Single values are strings of letters Values = pp.Forward() ListOfValues = '{' + pp.delimited_list(Values[...], delim=' ') + '}' # The lists inside the braces are space-separated values. Values <<= SingleValue | ListOfValues # Values are either words or braces-enclosed lists print(ListOfValues.parse_string('{aaa bbb {ccc ddd}}'))
这里做了三个核心修正:
- 对齐输入结构:
ListOfValues直接包含外层的{},解析入口的规则和输入格式完全匹配,解决了第一种写法的入口不匹配问题。 - 用
|替代^:|是“匹配任意符合条件的表达式”,递归场景下,遇到{开头的内容时会正确匹配ListOfValues,遇到字母时匹配SingleValue,保证了嵌套结构的解析逻辑正常。 - 明确的递归闭环:先通过
Forward()定义Values,再让ListOfValues依赖Values,最后把Values指向SingleValue | ListOfValues,形成完整的递归解析闭环,解析器可以正确处理多层嵌套。
内容的提问来源于stack exchange,提问作者plop
相关产品推荐
相关产品推荐

