为何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
相关产品推荐
相关产品推荐

