2017-09-20 31 views
1

我正在写一个文件格式的分析器,并有一个例子,我归纳为以下:为什么这个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")语句与第一个语句不匹配(我也尝试LineEnd(),结果相同)。

+2

默认情况下,pyparsing跳过标记之间的空格。空白包括换行符。 – user2357112

+0

是的,但我有一个专门匹配换行符的表达式。这令我感到困惑。 – u38cg

+0

没关系。这不会阻止它跳过空白以匹​​配更多的“元素”。 – user2357112

回答

2

您确实只需要再多一行,包括ParserElement.setDefaultWhitespaceChars即可删除换行符作为默认空白字符之一。像这样,我也'吞下'换行符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', '|']