为什么这个pyparsing语法不尊重行结尾?

时间:2017-09-20 22:50:18

标签: python parsing pyparsing

我正在编写一个文件格式的解析器,并有一个示例我已简化为以下内容:

import pyparsing as pp

element = pp.OneOrMore(pp.Word(pp.alphas)) | pp.Literal("|")
line = pp.Group(pp.OneOrMore(element)) + pp.White("\n")
top_level = pp.OneOrMore(line)

f = """
sdf dfg sdfgsdfsd | dsfgsdfsd sd sddffds safd | dfgdfg sadf | 
dsfg gdfg asdsad | gdfgdf dfgdfgdf sdf | dfgdfgdf |
"""

parse_result = top_level.parseString(f)
print(parse_result.dump())

这给出了:

[['sdf', 'dfg', 'sdfgsdfsd', '|', 'dsfgsdfsd', 'sd', 'sddffds', 'safd', '|', 'dfgdfg', 'sadf', '|', 'dsfg', 'gdfg', 'asdsad', '|', 'gdfgdf', 'dfgdfgdf', 'sdf', '|', 'dfgdfgdf', '|'], '\n']
[0]:
  ['sdf', 'dfg', 'sdfgsdfsd', '|', 'dsfgsdfsd', 'sd', 'sddffds', 'safd', '|', 'dfgdfg', 'sadf', '|', 'dsfg', 'gdfg', 'asdsad', '|', 'gdfgdf', 'dfgdfgdf', 'sdf', '|', 'dfgdfgdf', '|']
[1]:

我想要的是每行文本都显示为一个单独的Group(),并且我不清楚为什么pp.White("\n")语句与第一行不匹配(我也试过{{1结果相同)。

1 个答案:

答案 0 :(得分:2)

您真的只需要一行,涉及ParserElement.setDefaultWhitespaceChars以删除换行符作为默认空白字符之一。我也吞下了#39;带有suppress的换行符,就像这样。

>>> import pyparsing as pp
>>> pp.ParserElement.setDefaultWhitespaceChars(' \t')
>>> element = pp.OneOrMore(pp.Word(pp.alphas)) | pp.Literal("|")
>>> line = pp.Group(pp.OneOrMore(element)) + pp.White("\n").suppress()
>>> top_level = pp.OneOrMore(line)
>>> f = '''\
... sdf dfg sdfgsdfsd | dsfgsdfsd sd sddffds safd | dfgdfg sadf | 
... dsfg gdfg asdsad | gdfgdf dfgdfgdf sdf | dfgdfgdf |
... '''

>>> r = top_level.parseString(f)
>>> for item in r.asList():
...     item
... 
['sdf', 'dfg', 'sdfgsdfsd', '|', 'dsfgsdfsd', 'sd', 'sddffds', 'safd', '|', 'dfgdfg', 'sadf', '|']
['dsfg', 'gdfg', 'asdsad', '|', 'gdfgdf', 'dfgdfgdf', 'sdf', '|', 'dfgdfgdf', '|']