我希望同时使用整数(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"))
答案 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']]
我注意到原始代码有两件事。
setParseAction
与lambda
具有替换一个或多个令牌的效果,而这些令牌是lambda
的结果。我不认为这是你想要的,因为每个lambda
s的结果都是数字类型。s_int
首先放在bundle
解析器中,因此此解析器始终接受浮点常量,而不是整数常量。我把s_flt
解析器放在第一位。答案 1 :(得分:0)
我尝试使用Word(nums +'。'),但它也没有接受像1.1这样的浮点数。或1.1.1
我尝试了Word(数字)+'。 + Word(数字),但我不知道为什么pyparsing不能赶上浮点数(似乎应该可以)。
我最终使用了int + float + minus: 数字=可选('-')+单词(数字)+可选('。'+单词(数字))
不确定这是否是最好的解决方案,但它可能对与我一样的人有所帮助(我正在解析一些自定义规则以检查其有效性)。