这是我的代码:
l = "1.3E-2 2.5E+1"
parser = Word(alphanums + '+-.')
grammar = delimitedList(parser,delim='\t ')
print(grammar.parseString(l))
它返回:
['1.3E-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)”,这也更加不言自明。并且解析操作会在解析时将您的字符串转换为浮点数,这将在以后实际处理解析后的值时节省您的步骤。
祝你好运!