从<key> <value> ... <key> <val> wiredata </val> </key> </value> </key>中提取字典

时间:2014-01-06 12:56:09

标签: python

我正在扩展用C编写的低级仿真器,我必须发送和接收许多套接字报文。而不是在C中搞乱这个,我在嵌入式python脚本中进行此扩展。这部分很简单,但由于我不是一个熟练的python编码器,我倾向于最终得到一些相当优雅的代码。例如,解析有线编码字典的一部分。

在线上,字典看起来像这样:

&LT 3的密度;&LT; Mkey3&GT;&LT; 456&GT;&LT; Mkey2&GT;&LT; MVAL2&GT;&LT; MKey1&GT;&LT; MVAL1&GT;

提到有3个键值对:{MKey3:456,MKey2:MVal2,MKey1:MVal1}

我最终得到了这个实现,这对于测试来说已经足够好了,但是我很好奇它可以变得多么简单?

    tiddata = '<3><Mkey3><456><Mkey2><Mval2><MKey1><MVal1>'
    q1 = re.compile('^\<(?P<idatacnt>[^\>]*)\>(?P<idataload>.*)$')
    m1 = q1.search(tiddata)
    r1 = m1.groupdict()

    tidload = r1['idataload']
    tidcnt = int(r1['idatacnt'])

    tidata = {}
    q2 = re.compile ('\<(?P<k>[^\>]*)\>\<(?P<v>[^\>]*)\>')
    for m in q2.finditer(tidload):
        t = m.groupdict()
        tidata[t['k']] = t['v']

    if len(tidata) != tidcnt:
        print('Invalid itemdata: <%s>' %tiddata)
        return

1 个答案:

答案 0 :(得分:0)

我会做以下事情:

tiddata = '<Mkey3><456><Mkey2><Mval2><MKey1><MVal1>'
t = tiddata.strip('<>').split('><')
output = {t[i]: t[i+1] for i in range(0, len(t), 2)}