从字符串(javascript数组)获取有效的python列表

时间:2013-09-04 13:41:51

标签: python regex arrays json

我正在尝试从服务器的响应中获取有效的python列表,如下所示:

  

窗口.__ search.list = [{ “顺序”: “1”, “基”: “法”, “N”: “148904”, “访问”:{ “CSS”: “avail_yes”,“标题“:” \ u042   2 \ u0435 \ u043a \ u0441 \ u0442 \ u0434 \ u043e \ u043a \ u0443 \ u043c \ u0435 \ u043d \ u0442 \ u0430 \ u0434 \ u043e \ u0441 \ u0442 \ u0443 \ u043f \ u0435 \ u043d “},” 标题“: “\” \ u0410 \ u0440 \ u0431 \ u0438 \ u0442 \ u0440 \ u0430 \ u0436 \ u043d \ u044b \ u0439 \ u043f \ u0440 \ u043e \ u0446 \ u0435 \ u0441 \ u0441 \ u0443 \ u0430 \ u043b \ u044c \ u043d \ u044b \ u0439 \ u043a \ u043e \ u0434 \ u0435 \ u043a \ u0441 \ u0420 \ u043e \ u0441 \ u0441 \ u0438 \ u0439 \ u0441 \ u043a \ u043e \ u0439 \ u0424 \ u0435 \ u0434 \ u0435 \ u0440 \ u0430 \ u0446 \ u0438 \ u0438 \“\ u043e \ u0442 24.07.2002 N 95- \ u0424 \ u0417(\ u0440 \ u0435 \ u0434。\ u043e \ u0442 02.07.2013)(\ u0441 \ u0438 \ u0437 \ u043c。\ u0438 \ u0434 \ u043e \ u043f。,\ u0432 \ u0441 \ u0442 \ u0443 \ u043f \ u0444 \ u044e \ u0449 \ u043c \ u0444 \ u0432 \ u0441 \ u0438 \ u043b \ u0443 \ u0441 01.08.2013)“},...} ];

我是通过切断“window .__ search.list =”和“;”来实现的。从使用data = json.loads(re.search(r"(?=\[)(.*?)\s*(?=\;)", url).group(1))的字符串开始,它看起来像标准的JSON:

  

[{u'access':{u'css':u'avail_yes',u'title':u'\ u0422 \ u0435 \ u043a \ u0441 \ u0442 \ u0434 \ u043e \ u043a \ u04   43 \ u043c \ u0435 \ u043d \ u0442 \ u0444 \ u043e \ u0441 \ u0443 \ u043f \ u0444 \ u043d'},u'title':u'“\ u0410 \ u0440 \ u0431 \ u0438 \ u0442 \ u0440 \ u0430 \ u0436 \ u043d \ u044b \ u0439 \ u043f \ u0440 \ u043e \ u0446 \ u0435 \ u0441 \ u0441 \ u0443 \ u0430 \ u043b \ u044c \ u043d \ u044b \ u0439 \ u043a \ u043e \ u0434 \ u0435 \ u043a \ u0441 \ u0420 \ u043e \ u0441 \ u0441 \ u0444 \ u0441 \ u0441 \ u0444 \ u0424 \ u0435 \ u0434 \ u0435 \ u0440 \ u0430 \ u0446 \ u0438 \ u0438“\ u043e \ u0442 24.07.2002 N 95- \ u0424 \ u0417(\ u04   40 \ u0435 \ u0434。 \ u043e \ u0442 02.07.2013)(\ u0441 \ u0438 \ u0437 \ u043c。\ u0438 \ u0434 \ u043e   \ u043f。,\ u0432 \ u0441 \ u0442 \ u0443 \ u043f \ u0430 \ u044e \ u0449 \ u0438 \ u043c \ u0438 \ u0432 \ u0441   \ u0438 \ u043b \ u0443 \ u0441 01.08.2013)','u'base':u'LAW','''':u'1',u'n':u'148904'},...}]

但有时,在迭代其他网址时,我会收到如下错误:

File "/Developer/Python/test.py", line 123, in order_search
    data = json.loads(re.search(r"(?=\[)(.*?)\s*(?=\;)", url).group(1))
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 326, in loads
    return _default_decoder.decode(s)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 366, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 382, in raw_decode
    obj, end = self.scan_once(s, idx)
ValueError: Invalid \uXXXX escape: line 1 column 20235 (char 20235)

我该如何修复它,或者可能有另一种获取有效JSON的方法(使用本机库是可取的)?

2 个答案:

答案 0 :(得分:3)

可能你的正则表达式找到了char';'在响应中间的某个地方,因此,您会收到错误,因为使用正则表达式,您可能收到了不完整的裁剪响应,这就是您无法将其转换为JSON的原因。

是的,我同意用户RickyA有时使用本机工具,代码比试图组成RegEx更容易阅读。但在这里,我宁愿使用完全正则的表达式,如下所示:

data = re.search(r'(?=\[)(.*?)[\;]*$', response).group(1)
/(?=\[)(.*?)[\;]*$/
(?=\[) Positive Lookahead
\[ Literal [
1st Capturing group (.*?)
. 0 to infinite times [lazy] Any character (except newline)
Char class [\;] 0 to infinite times [greedy] matches:
\; The character ;
$ End of string

我认为你的意思是变量' url '表示来自服务器的响应,然后可能更好地使用变量'响应'的名称而不是'网址”。

而且,如果您在使用RegEx时遇到麻烦,我建议您使用正则表达式的编辑器,如RegEx 101。这是在线正则表达式编辑器,它解释了输入表达式的每个块。 / p>

答案 1 :(得分:2)

怎么样:

response = response.strip() #get rid of whitespaces
response = response[response.find("["):] #trim everything before the first '['
if response[-1:] == ";": #if last char == ";"
    response = response[:-1] #trim it

使用正则表达式看起来像是一个很大的过度杀伤。