我正在尝试使用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
?当然,我可以在以后的处理步骤中将其转换,但我希望输入数据是一致的。