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

为何pyparsing会移除空白字符?已设set_default_whitespace_chars('')仍异常

问题原因与解决方案

原因分析

问题出在pp.nestedExpr的默认行为上:

  • 即便你全局设置了pp.ParserElement.set_default_whitespace_chars(''),nestedExpr内部默认采用空白分割token的逻辑,它会将连续的非空白字符合并为单个token,同时自动丢弃所有空白字符(包括换行、空格)。
  • 比如selector\n会被解析成selector,\n a:b;会被解析成a:b;,这就是部分空白被移除的核心原因。

解决方案

要完整保留所有空白字符,需要自定义nestedExpr的内容解析规则,用pp.SkipTo捕获{或}之间的所有原始内容(包含空白),替代默认的token分割逻辑。修改后的代码如下:

import pyparsing as pp

pp.ParserElement.set_default_whitespace_chars('')

def parse(input_str):
    # 自定义内容解析器:捕获到下一个{或}之前的所有内容,保留空白
    content = pp.SkipTo(pp.oneOf('{}'))
    # 使用自定义内容解析器构建嵌套表达式
    nested_exp = pp.nestedExpr('{', '}', content=content).parseString("{"+input_str+"}").asList()
    return nested_exp

input_str = """selector
{
  a:b;
  c:d;
  selector
  {
    a:b;
    c:d;
  }
  y:z;
}"""

my_output = parse(input_str)
print(my_output)

实际输出

运行后会得到符合预期的结果:

[['selector\n', ['\n  a:b;\n  c:d;\n  selector\n', ['\n    a:b;\n    c:d;\n'], '\n  y:z;\n']]]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 06:02:37