Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么这个语法不考虑行尾呢?_Python_Parsing_Pyparsing - Fatal编程技术网

Python 为什么这个语法不考虑行尾呢?

Python 为什么这个语法不考虑行尾呢?,python,parsing,pyparsing,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 saf

我正在编写一个文件格式的解析器,下面是一个示例:

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]:

我想要的是每一行文本都显示为一个单独的组(),我不清楚为什么
pp.White(“\n”)
语句与第一行不匹配(我也尝试了
LineEnd()
,得到了相同的结果)。

您真的只需要多行,包含
parseRelation.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', '|']

默认情况下,pyparsing跳过标记之间的空白。空白包括换行符。是的,但我有一个表达式专门匹配换行符。这就是我困惑的地方,没关系。这并不能阻止它跳过空格来匹配更多的
元素。