Pyparsing setParseAction不会将字符串转换为int

时间:2018-08-31 12:39:52

标签: python pyparsing

我正在尝试使用pyparsing解析某些古老的工业设备数据格式,并遇到我不了解的行为。

输入字符串格式为:R<x0>,<y0>,<w>,<h>[,*<level>];,其中x0,y0,w,h是实数,级别是1-8之间的整数。星号标记级别令牌的存在,可以省略整个级别构造,在这种情况下,默认为1

我希望解析器输出一个像[x0, y0, w, h, level]这样的数字列表,并将这些数字转换为适当的数据类型。

我编写的解析器几乎可以实现我想要的一个细微差别:

from pyparsing import Word, nums, ZeroOrMore, Suppress, Literal, Optional, Combine, StringEnd, srange

rtext = 'R.0,.2,5.7,.2,*1;'
# rtext = 'R0.0,0.2,5.7,0.2;'

real = Combine(ZeroOrMore(Word(nums)) + Literal('.') + Word(nums)).setParseAction(lambda s, l, t: float(t[0]))
level = Word(srange('[1-8]')).setParseAction(lambda s, l, t: int(t[0]))
rect_mark = Suppress('R')
comma = Suppress(',')
star = Suppress('*')
semicolon = Suppress(';')
level_str = Combine(star + level)

rect = rect_mark + real + comma + real + comma + real + comma + real + \
       Optional(comma + level_str, default=1) + semicolon + StringEnd()

res = rect.parseString(rtext)
print(res)   # => [0.0, 0.2, 5.7, 0.2, '1']

为什么级别令牌不能转换为int?当然,我可以在以后的处理步骤中将其转换,但我希望输入数据是一致的。

0 个答案:

没有答案