使用Python';加载包含正则表达式值的json,是否中断?

使用Python';加载包含正则表达式值的json,是否中断?,python,json,regex,Python,Json,Regex,TL,DR如何使用加载包含带有转义后格的正则表达式的JSON 细节正则表达式\\[0-9]\\\将匹配(例如): 相同的正则表达式可以编码为JSON值: { "pattern": "\\[0-9]\\" } 反过来,JSON值可以在Python中编码为字符串(请注意单引号): 在Python中加载JSON时,会引发: import json json.loads('{"pattern": "\\[0-9]\\"}') 该问题是由逃避黑斜杠的正则表达式引起的: Traceback (mos

TL,DR如何使用加载包含带有转义后格的正则表达式的JSON

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

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

{
  "pattern": "\\[0-9]\\"
}
反过来,JSON值可以在Python中编码为字符串(请注意单引号):

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

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]\\"}')
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/json/_init__.py”,第348行,在loads中
返回\u默认\u解码器。解码
文件“/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/json/decoder.py”,第337行,在decode中
obj,end=self.raw\u decode(s,idx=\u w(s,0.end())
文件“/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/json/decoder.py”,第353行,原始解码
obj,end=self.scan_一次(s,idx)
json.decoder.JSONDecodeError:无效\escape:第1行第14列(字符13)
>>>加载(“{”模式“\\[0-9]\\“}”)
这让我很惊讶,因为每个步骤似乎都是合理的(即有效的正则表达式、有效的JSON和有效的Python)


如何使用加载包含带有转义后格的正则表达式的JSON?

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

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

所发生的事情是,Python首先将输入转义为字符串文本形式加载到
,使其成为
“{”模式“\[0-9]\“}”
(双反斜杠->单反斜杠)。然后,
加载
现在尝试转义
\[
,这是无效的。要修复此问题,请再次转义反斜杠。但是,将其指定为原始字符串更容易、更实用:

>>> 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

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

import json

with open('test.json', 'r') as infile:
    json.load(infile) # no problem

基本上,这个问题是由于您传递的是字符串文字,但具有讽刺意味的是,您的字符串文字没有按字面意思理解。

json.loads(r'{“pattern”:“\\[0-9]\\\”}”)
你的实际JSON是什么?你的字符串文字不正确,但是你加载的东西应该是什么。regex错误是什么?如果不使用原始语法,这将如何实现?@sln:再次转义反斜杠:
'{“模式”:“\\\\\[0-9]\\\\\”}
@sln我的意思是,你可以做
'{“模式”:“\\\\\\\[0-9]\\\”}“
,但特别是如果您从外部源获取json字符串,原始语法更好。因此在python中,单引号字符串与双引号字符串相同?其中,
”\n“
是回车符?@Jack我应该说得更好,我的意思是python处理字符串文本中的转义序列。例如,r用换行符替换
\n
,用制表符替换
\t
,等等。
{"pattern": "\\[0-9]\\"}
import json

with open('test.json', 'r') as infile:
    json.load(infile) # no problem