Pyparsing分隔列表仅返回第一个元素

时间:2014-12-18 17:44:53

标签: python pyparsing

这是我的代码:

l = "1.3E-2   2.5E+1"
parser = Word(alphanums + '+-.')
grammar = delimitedList(parser,delim='\t ')
print(grammar.parseString(l))

它返回:

['1.3E-2']

有意思的是,我想要所有这两个价值观,而不是一个,不知道发生了什么?

2 个答案:

答案 0 :(得分:7)

如果切换到原始字符串,则有效:

l = r"1.3E-2\t2.5E+1"
parser = Word(alphanums + '+-.')
grammar = delimitedList(parser, delim=r'\t')
print(grammar.parseString(l))

打印:

['1.3E-2', '2.5E+1']

通常,delimitedList与PDPDP类似,其中P是解析目标,D是分隔符或分隔符序列。

你有delim='\t '。具体是1个标签的分隔符,后跟1个空格;它不是标签或空格。

答案 1 :(得分:6)

正如@dawg所解释的那样,delimitedList适用于具有分隔非空白分隔符(通常为逗号)的表达式的情况。 Pyparsing隐式跳过空格,所以在pyparsing世界中,你真正看到的不是分隔列表,而是OneOrMore(realnumber)。此外,除非使用str.expandtabs参数,否则parseString会在提供的输入字符串上内部调用parseWithTabs=True。将制表符扩展到空格有助于在表格形式下保留数据的列式对齐,当我最初编写pyparsing时,这是一个普遍的用例。

如果您可以控制此数据,那么您可能希望使用与<TAB>不同的分隔符,可能是逗号或分号。如果您坚持使用此格式,但决定使用pyparsing,则使用OneOrMore。

当您继续前进时,您还需要更准确地了解您定义的表达式和您使用的变量名称。名称“解析器”的信息量不大,Word(alphanums+'+-.')的模式除了科学计数法中的有效实际值之外还会匹配很多东西。我知道如果你只是想让任何工作,这是一个合理的第一次切割,你可以回来调整它一旦你有所作为。如果实际上你要解析实数,这里有一个可能有用的表达式:

realnum = Regex(r'[+-]?\d+\.\d*([eE][+-]?\d+)?').setParseAction(lambda t: float(t[0]))

然后你可以将你的语法定义为“OneOrMore(realnum)”,这也更加不言自明。并且解析操作会在解析时将您的字符串转换为浮点数,这将在以后实际处理解析后的值时节省您的步骤。

祝你好运!