结合使用Python的json.loads和包含正则表达式值的JSON,会中断吗?

时间:2019-01-03 19:54:40

标签: python json regex

TL,DR; 如何使用Python's JSON decoder加载包含带有转义后缀的正则表达式的JSON?

详细信息; 正则表达式\\[0-9]\\将匹配(例如):

\2\

同一正则表达式可以编码为JSON值:

{
  "pattern": "\\[0-9]\\"
}

依次,JSON值可以在Python中编码为字符串(请注意单引号):

'{"pattern": "\\[0-9]\\"}'

在Python中加载JSON时,会引发JSONDecodeError

import json
json.loads('{"pattern": "\\[0-9]\\"}')

问题是由正则表达式转义了黑斜杠引起的:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/json/__init__.py", line 348, in loads
    return _default_decoder.decode(s)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/json/decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/json/decoder.py", line 353, in raw_decode
    obj, end = self.scan_once(s, idx)
json.decoder.JSONDecodeError: Invalid \escape: line 1 column 14 (char 13)
>>> json.loads('{"pattern": "\\[0-9]\\"}')

这让我感到惊讶,因为每个步骤似乎都是合理的(即有效的正则表达式,有效的JSON和有效的Python)。

如何使用Python's JSON decoder加载包含带有转义后缀的正则表达式的JSON?

2 个答案:

答案 0 :(得分:2)

正在发生的事情是,Python首先将输入{@ {1}}转义为字符串文字,使其变为loads(双反斜杠->单反斜杠)。然后,'{"pattern": "\[0-9]\"}'现在尝试转义loads,这是无效的。要解决此问题,请再次转义反斜杠。但是,将其指定为原始字符串更容易,更实用:

\[

请注意,如果从文件加载,则不会出现此问题。

>>> import json >>> json.loads('{"pattern": "\\[0-9]\\"}') json.decoder.JSONDecodeError: Invalid \escape: line 1 column 14 (char 13) >>> json.loads(r'{"pattern": "\\[0-9]\\"}') {'pattern': '\\[0-9]\\'} # No error

test.json

Python:

{"pattern": "\\[0-9]\\"}

基本上,问题是由于您传入的是字符串 literal ,但具有讽刺意味的是,您的字符串 literal 并没有被接受为 literally

答案 1 :(得分:0)

r表示该字符串将被视为原始字符串,这意味着所有转义码都将被忽略:

json.loads(r'{"pattern": "\\[0-9]\\"}')