2017-09-20 29 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', '|']