[英]Why is this pyparsing grammar not respecting line endings?
我正在為一種文件格式編寫解析器,並且有一個示例已簡化為以下示例:
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()
,結果相同)。
您實際上只需要一行,涉及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', '|']
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.