Python string.split不能达到我的预期

时间:2013-05-25 21:53:43

标签: python

我有一串很奇怪的字符串,我想分成一个列表:

"44":{"1":4.6,"0":1.53,"2":7.2},"53":{"1":4.2,"0":1.4,"2":6.75},"121":{"1":3.2,"0":1.6,"2":6}

理想情况下,我想:

"44":{"1":4.6,"0":1.53,"2":7.2}
"53":{"1":4.2,"0":1.4,"2":6.75}
"121":{"1":3.2,"0":1.6,"2":6}

但是我决定分开每一个}。

mystring.split('}')似乎将我的字符串拆分为一个列表,每个字符有一个元素由于某种原因。不知道我做错了什么。救命啊!

6 个答案:

答案 0 :(得分:4)

几乎看起来像是有效的JSON。

>>> s = '"44":{"1":4.6,"0":1.53,"2":7.2},"53":{"1":4.2,"0":1.4,"2":6.75},"121":{"1":3.2,"0":1.6,"2":6}'
>>> import json
>>> d = json.loads("{" + s + "}")
>>> d
{'53': {'2': 6.75, '0': 1.4, '1': 4.2}, '44': {'2': 7.2, '0': 1.53, '1': 4.6}, '
121': {'2': 6, '0': 1.6, '1': 3.2}}
>>> for key,value in d.items():
...    print("Key: {0} - Value: {1}".format(key,value))
...
Key: 53 - Value: {'2': 6.75, '0': 1.4, '1': 4.2}
Key: 44 - Value: {'2': 7.2, '0': 1.53, '1': 4.6}
Key: 121 - Value: {'2': 6, '0': 1.6, '1': 3.2}

答案 1 :(得分:1)

你可以试试这个:

s = '"44":{"1":4.6,"0":1.53,"2":7.2},"53":{"1":4.2,"0":1.4,"2":6.75},"121":{"1":3.2,"0":1.6,"2":6}'
h = eval("{"+s+"}")
for k in h: print k,h[k]

但由于eval不安全,因为它可以执行任意代码,所以使用literal_eval要好得多。 literal_eval仅适用于有效的数据类型:

from ast import literal_eval
s = # ....
h = literal_eval("{"+s+"}")
for k in h: print k,h[k]

<强>输出

121 {'1': 3.2, '0': 1.6, '2': 6}
44 {'1': 4.6, '0': 1.53, '2': 7.2}
53 {'1': 4.2, '0': 1.4, '2': 6.75}

答案 2 :(得分:0)

您可以这样做:

>>> string = '"44":{"1":4.6,"0":1.53,"2":7.2},"53":{"1":4.2,"0":1.4,"2":6.75},"121":{"1":3.2,"0":1.6,"2":6}'
>>> string.replace('},','}***').split('***')
['"44":{"1":4.6,"0":1.53,"2":7.2}', '"53":{"1":4.2,"0":1.4,"2":6.75}', '"121":      {"1":3.2,"0":1.6,"2":6}']

答案 3 :(得分:0)

正确回答您的问题取决于允许的表达方式。如果表达式可能包含嵌套大括号,那么您需要递归正则表达式。以下解决方案不支持嵌套大括号,但它足以解析您的示例:

    for token in re.findall(r'((?:[^{,]|{.*?})+)', mystring):
        print token

答案 4 :(得分:0)

您的输入几乎是JSON;这是字典的内容,只是缺少了括号括号

import json
nearly_json = '"44":{"1":4.6,"0":1.53,"2":7.2},"53":{"1":4.2,"0":1.4,"2":6.75},"121":{"1":3.2,"0":1.6,"2":6}'

d = json.loads(f'{{ {nearly_json} }}') # Add the missing enclosing braces, and convert to Python (deserialize)...

d
{'44': {'1': 4.6, '0': 1.53, '2': 7.2}, '53': {'1': 4.2, '0': 1.4, '2': 6.75}, '121': {'1': 3.2, '0': 1.6, '2': 6}}

d['44']
{'1': 4.6, '0': 1.53, '2': 7.2}

正如TimPietzcker所说,您现在可以遍历该命令,例如与.items() 或者,您可以访问其.keys()

答案 5 :(得分:-2)

只是分开逗号?

print '"44":{"1":4.6,"0":1.53,"2":7.2},"53":{"1":4.2,"0":1.4,"2":6.75},"121":{"1":3.2,"0":1.6,"2":6}'.split(',')

给出:

['"44":{"1":4.6', '"0":1.53', '"2":7.2}', '"53":{"1":4.2', '"0":1.4', '"2":6.75}', '"121":{"1":3.2', '"0":1.6', '"2":6}']

这就是你要求的。

相关问题