如何在pyparsing中同时使用整数和浮点数

时间:2018-01-12 10:49:33

标签: python pyparsing

我希望同时使用整数(s_int)和float(s_flt)。

我的代码只能用于整数。如果要将bundle = s_int | s_flt | ident更改为bundle = s_flt | s_int | ident,则此代码只能用于浮点数。

import pyparsing as p

ident = p.Word(p.alphas + '_', p.alphanums + '_.')
s_int = p.Word(p.nums    ).setParseAction(lambda tokens: int  (tokens[0]))
s_flt = p.Word(p.nums+'.').setParseAction(lambda tokens: float(tokens[0]))

bundle = s_int | s_flt | ident
member = p.Group(ident + p.Suppress(':') + bundle)
parser = p.delimitedList (member) 
print (parser.parseString("id: 0, name: ex1, x: 1.0, y: 2.0, z:5.0"))
print (parser.parseString("id: 1, name: ex2, x: 1  , y: 2.0"))

2 个答案:

答案 0 :(得分:2)

我认为这可能会做你想要的。

import pyparsing as p

ident = p.Word(p.alphanums + '_.')
s_int = p.Word(p.nums    )
s_flt = p.Word(p.nums+'.')

bundle = s_flt | s_int | ident
member = p.Group(ident + p.Suppress(':') + bundle)
parser = p.delimitedList (member) 
print (parser.parseString("id: 0, name: ex1, x: 1.0, y: 2.0, z:5.0"))
print (parser.parseString("id: 1, name: ex2, x: 1  , y: 2.0"))

输出:

[['id', '0'], ['name', 'ex1'], ['x', '1.0'], ['y', '2.0'], ['z', '5.0']]
[['id', '1'], ['name', 'ex2'], ['x', '1'], ['y', '2.0']]

我注意到原始代码有两件事。

  • setParseActionlambda具有替换一个或多个令牌的效果,而这些令牌是lambda的结果。我不认为这是你想要的,因为每个lambda s的结果都是数字类型。
  • 由于s_int首先放在bundle解析器中,因此此解析器始终接受浮点常量,而不是整数常量。我把s_flt解析器放在第一位。

答案 1 :(得分:0)

我尝试使用Word(nums +'。'),但它也没有接受像1.1这样的浮点数。或1.1.1

我尝试了Word(数字)+'。 + Word(数字),但我不知道为什么pyparsing不能赶上浮点数(似乎应该可以)。

我最终使用了int + float + minus: 数字=可选('-')+单词(数字)+可选('。'+单词(数字))

不确定这是否是最好的解决方案,但它可能对与我一样的人有所帮助(我正在解析一些自定义规则以检查其有效性)。