我正试图从服务器的响应中获取有效的python列表,如下所示:
window.\uu search.list=[{“order”:“1”,“base”:“LAW”,“n”:“148904”,“access”:{“css”:“avail_yes”,“title”:“\u042
2\u0435\u043a\u0441\u0442\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d“},“title”:““““\u0410\u0410\u0440\u0440\u0440\u0440\u0440\u0440\u0430\u0436\u043d\u043d\u044b\u044b\u0439\u043f\u0440\u0440\u0430\u0440\u043e\u0446\u0435\u0441\u0441\u0441\u0443\u0443\u0430\u0430\u043b\u044c\U04043D\U0404044B\U040404040440\u0440\u0440\u0440\u0440\u0440\u0440\u0440\u0440\u0440\u0441\u0438\u0439\u0441\u043a\u043e\u0439\u0424\u0435\u0434\u0435\u0440\u0430\u0446\u0438\u0438\“\u043e\u0442 24.07.2002 N95-\u0424\u0417(\u0440\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)}。。。}];
我使用data = json.loads(re.search(r"(?=\[)(.*?)\s*(?=\;)", url).group(1))从字符串中截取“window.\uu search.list=”and“;”,然后它看起来像标准的JSON:
[{u'access':{u'css':u'avail\u yes',u'title':u'\u0422\u0435\u043a\u0441\u0442\u0434\u043e\u043a\u04
43\u043c\u0435\u043d\u0442\u0430\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d'},u’title’:u’:u’:u’:U040410\u0410\u0440\u0440\u0440\u0440\u0440\u0430\u0430\u0436\u043d\u043d\u044b\u044b\u0439\u0439\u043f\u0440\u0440\u043e\u0446\u0446\u0435\u0441\u0441\u0441\u0441\u0441\u0443\u0443\u0430\u0430\U043BU043B\U04044C\U040404040404044C\u043d\U04040404044B\U040446\u0446\u0435\u0441\u0438\u0439\u0441\u043a\u043e\u0439\u0424\u0435\u0434\u0435\u0440\u0430\u0446\u0438\u0438“\u043e\u0442 24.07.2002 N95-\u0424\u0417(\u04
40\u0435\u0434。\u043e\u0442 2013年7月2日)(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'order':u'1',u'n':u'148904'}。。。}]
但有时,在迭代其他url时,我会得到这样的错误:

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(希望使用本机库)?

最佳答案

可能,正则表达式在响应中间的某个位置找到了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'表示来自服务器的响应,那么最好使用变量'response'的名称,而不是'url'。
而且,如果您在使用RegEx时遇到一些问题,我建议您使用正则表达式编辑器,比如RegEx 101。这是联机正则表达式编辑器,它解释了输入的每个表达式块。

关于python - 从字符串(javascript数组)获取有效的python列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18615524/

10-10 07:42