Python 使用格式模式将字符串反序列化为值

Python 使用格式模式将字符串反序列化为值,python,serialization,format,Python,Serialization,Format,我正试图为(反)序列化程序找到一个好的解决方案。 我有一个格式模式和所有要输入的值 格式模式如下所示: msg = '$bla,%d,%02d,%02d %02d:%02d:%02d.%03d' % (kwargs['...'], ...) 序列化这些值时,会得到以下字符串: bla,1990,12,24 13:37:11.001 但我也必须反序列化它。图案的长度和类型可能会有很大差异。 我只想根据格式模式反序列化字符串 你知道这是如何实现的吗 编辑:我使用的是Python2.7.6在一些假

我正试图为(反)序列化程序找到一个好的解决方案。 我有一个格式模式和所有要输入的值

格式模式如下所示:

msg = '$bla,%d,%02d,%02d %02d:%02d:%02d.%03d' % (kwargs['...'], ...)
序列化这些值时,会得到以下字符串:

bla,1990,12,24 13:37:11.001
但我也必须反序列化它。图案的长度和类型可能会有很大差异。 我只想根据格式模式反序列化字符串

你知道这是如何实现的吗


编辑:我使用的是Python2.7.6

在一些假设下,您可能可以使用正则表达式来完成这项工作。这里是一个局部示例,您可能需要添加到其中以获得完整的解决方案。基本上,我们将每种打印格式转换为一个与之匹配的正则表达式

import re
formattuple = (1990,12,24,13,37,11,1) 
formatstr = 'bla,%d,%02d,%02d %02d:%02d:%02d.%03d'

def rep_format(fmt):
    fmt = fmt.group(0)
    if fmt[0] != '%':
        return fmt
    if fmt == '%d':
        return r'(\d+)'
    ftype = fmt[-1]
    if ftype == 'd':
       fwidth = int(fmt[1:-1])
       return r'(\d{%d})'%(fwidth)
    else:
       return fmt

scanstr = re.sub(r'%\d+[df]', rep_format, formatstr)
scanstr
'bla,(\\d+),(\\d{2}),(\\d{2}) (\\d{2}):(\\d{2}):(\\d{2}).(\\d{3})'

fstr = formatstr%formattuple
fstr
'bla,1990,12,24 13:37:11.001'

match = re.match(scanstr, fstr)
match.groups()
('1990',
 '12',
 '24',
 '13',
 '37',
 '11',
 '001')
mtuple = tuple(int(x) for x in match.groups())

如果您可以完全控制协议,或者在序列化后说
format
,我建议使用一些现有的解决方案,例如Python标准库提供的解决方案,它在web上非常流行,或者是Google提供的跨语言解决方案

:

:

请注意,json有一些限制,例如,除了dict、list和tuple之外,序列化和反序列化对象有点困难。不会反序列化为完全相同的格式,因为json中不存在某些数据结构,如元组


是一个更强大但更复杂的解决方案。您需要首先定义数据架构。

不幸的是,我无法控制协议。传入的字符串总是与我发布的字符串相似。
>>> import pickle
>>> formattuple = (1990,12,24,13,37,11,1) 
>>> s = pickle.dumps(formattuple)
>>> s
'(I1990\nI12\nI24\nI13\nI37\nI11\nI1\ntp0\n.'
>>> pickle.loads(s)
(1990, 12, 24, 13, 37, 11, 1)
>>> import json
>>> formattuple = (1990,12,24,13,37,11,1)
>>> s = json.dumps(formattuple)
>>> s
'[1990, 12, 24, 13, 37, 11, 1]'
>>> json.loads(s)
[1990, 12, 24, 13, 37, 11, 1]