这是我的代码:
l = "1.3E-2 2.5E+1"
parser = Word(alphanums + '+-.')
grammar = delimitedList(parser,delim='\t ')
print(grammar.parseString(l))
Run Code Online (Sandbox Code Playgroud)
它返回:
['1.3E-2']
Run Code Online (Sandbox Code Playgroud)
有意思的是,我想要所有的价值观,而不是单一的价值观,知道发生了什么?
如果切换到原始字符串,则有效:
l = r"1.3E-2\t2.5E+1"
parser = Word(alphanums + '+-.')
grammar = delimitedList(parser, delim=r'\t')
print(grammar.parseString(l))
Run Code Online (Sandbox Code Playgroud)
打印:
['1.3E-2', '2.5E+1']
Run Code Online (Sandbox Code Playgroud)
在一般情况下,delimitedList作品的东西,如PDPDP这里P是解析目标,并D为delimter或划定序列.
你有delim='\t '.具体是1个标签的分隔符,后跟1个空格; 它不是标签或空格.
正如@dawg所解释的那样,delimitedList适用于具有分隔非空白分隔符(通常是逗号)的表达式的情况.Pyparsing隐式跳过空白,所以在pyparsing世界中,你真正看到的不是分隔符,而是OneOrMore(realnumber).另外,str.expandtabs除非使用parseWithTabs=True参数,否则parseString会在内部调用提供的输入字符串.将制表符扩展到空格有助于在表格形式下保留数据的列式对齐,当我最初编写pyparsing时,这是一个普遍的用例.
如果您可以控制此数据,那么您可能希望使用与<TAB>逗号或分号不同的分隔符.如果您坚持使用此格式,但决定使用pyparsing,则使用OneOrMore.
在前进的过程中,您还需要更准确地了解您定义的表达式以及您使用的变量名称.名称"解析器"的信息量不大,Word(alphanums+'+-.')除了科学记数法中有效的实际值之外,其模式还会匹配很多东西.我知道如果你只是想让任何工作得到,这是一个合理的第一次切割,你可以回来调整它一旦你有所作为.如果实际上你要解析实数,这里有一个可能有用的表达式:
realnum = Regex(r'[+-]?\d+\.\d*([eE][+-]?\d+)?').setParseAction(lambda t: float(t[0]))
Run Code Online (Sandbox Code Playgroud)
然后你可以将你的语法定义为"OneOrMore(realnum)",这也更加不言自明.并且解析操作会在解析时将字符串转换为浮点数,这将在以后实际处理解析后的值时节省您的步骤.
祝好运!