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

标签 python regex arrays json

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

window.__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\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\u0430 \u044e\u0449\u0438\u043c\u0438\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\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\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\u0438\u0439\u0441\u043a\u043e\u0439\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'order': 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(最好使用 native 库)?

最佳答案

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

是的,我同意用户 RickyA 的观点,有时使用 native 工具,代码比尝试编写正则表达式更容易阅读。但在这里,我宁愿使用正则表达式,如下所示:

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”的名称而不是“>网址'。

而且,如果您在使用 RegEx 时遇到一些问题,我建议您使用正则表达式编辑器,例如 RegEx 101 .这是在线正则表达式编辑器,它对输入的每 block 表达式进行解释。

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

相关文章:

python - pandas 应用一个新列

python - 为什么不能直接使用 print(something.sort()) ?

python - SQLAlchemy,清除数据库内容但不删除架构

javascript - 在 Javascript 中验证带有时间偏移量的日期时间字符串

java - 在java中通过标点符号和空格等通过正则表达式拆分字符串

javascript - 按结尾数字对以数字结尾的字符串进行排序

php - 在数据库中正确输入复选框值

python - 谷歌CP : Creating Client() object locally

c# - 正则表达式从字符串中删除所有特殊字符?

java - 数组中的数量和出现