将字符串解析为适当的变量

时间:2014-05-23 02:20:55

标签: python

[[{"date":"January 2004"},true,false,100,null,null,true],[{"date":"February 2004"},false,false,99,null,null,true]]

我有一长串来自javascript文件的数据,如上所述。是否有快捷方式或库可以将其解析为适当的数据类型?

如您所见,它是包含字典,布尔值,整数和空值的列表列表。

我的意思是,我可以手工做到这一点,但我认为我不能很快或有效地做到这一点。必须有一个更好的方法。

2 个答案:

答案 0 :(得分:5)

漂亮接近有效的JSON。唯一无效的是False应为falseTrue应为true。那可能是转录错误(...是的)


使用json

import json

x = '[[{"date":"January 2004"},true,false,100,null,null,true],[{"date":"February 2004"},false,false,99,null,null,true]]'

json.loads(x)
Out[20]: 
[[{'date': 'January 2004'}, True, False, 100, None, None, True],
 [{'date': 'February 2004'}, False, False, 99, None, None, True]]

答案 1 :(得分:2)

我建议你看一下PyParsing。

http://pyparsing.wikispaces.com/

您还可以查看Python" scanf"库。

sscanf in Python

如果你只需要使用Python内置函数来解决这个问题,我建议使用带捕获组的正则表达式。

编辑:嗯,我再看看这个。你确实说它来自JavaScript ...这对我来说就像一个合法的JSON数组。我尝试使用json模块(特别是方法函数json.loads()),但我无法解析它。

但是! Python语法接近JavaScript语法。替换一些内容,eval()可以解析此内容,或ast.literal_eval()。我们需要将true替换为True,将false替换为False,将null替换为Noneast.literal_eval()将接受import ast s = '[[{"date":"January 2004"},True,False,100,null,null,true],[{"date":"February 2004"},False,False,99,null,null,true]]' s1 = s.replace("true","True").replace("false","False").replace("null","None") x = ast.literal_eval(s1) print(x)

[[{'date': 'January 2004'}, True, False, 100, None, None, True], [{'date': 'February 2004'}, False, False, 99, None, None, True]]

以上将打印:

true = True

最初我展示了定义变量(比如eval())并使用eval()来解析它,但当然ast是一个潜在的安全漏洞;因此,如果您需要解析可能来自网页或任何其他不受信任来源的文字,则需要花费少量精力导入ast.literal_eval()并使用json

编辑:好的,True模块可以解析这个;问题是使用true代替Falsefalse代替str.replace()。只需使用json.loads()方法函数来修复它们,然后.replace()就可以解析它。

我正准备发布带有True方法调用的代码片段,当问题再次更新时,大写的Falses = '[[{"date":"January 2004"},true,false,100,null,null,true],[{"date":"February 2004"},false,false,99,null,null,true]]' import json x = json.loads(s) print(x) 成为普通的合法JSON版本。< / p>

所以我的最终答案是:

[[{u'date': u'January 2004'}, True, False, 100, None, None, True], [{u'date': u'February 2004'}, False, False, 99, None, None, True]]

打印:

{{1}}