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?
答案 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]\\"}')