2024-10-01 02:25:49 发布
网友
我正在将一个JSON文件读入Python,其中包含转义单引号(\')。这会导致各种各样的打嗝,正如我们所讨论的here。然而,我找不到任何关于如何解决这个问题的东西。我刚做了一个
newstring=originalstring.replace(r"\'", "'")
一切都解决了。但这看起来很难看。在json docs中,我真的找不到很多关于如何处理这种事情(创建异常或其他事情)的材料。在
很遗憾,回到源头是不可能的。在
谢谢你的帮助!在
JSON standard定义了一组特定的valid 2-character escape sequences:\\,\/,\",\b,\r,\n,\f和{},以及一个4个字符的转义序列来定义任何Unicode代码点,\uhhhh(\u加4个十六进制数字)。反斜杠和其他字符的任何其他序列都是无效的JSON。在
\\
\/
\"
\b
\r
\n
\f
\uhhhh
\u
如果您有一个JSON源代码,否则您无法修复,唯一的办法就是删除无效序列,就像您对str.replace()所做的那样,即使它有点脆弱(当引号前面有一个偶数的反斜杠序列时,它将中断)。在
str.replace()
您也可以使用正则表达式,删除有效序列中未使用的任何反斜杠:
fixed = re.sub(r'(?<!\\)\\(?!["\\/bfnrt]|u[0-9a-fA-F]{4})', r'', inputstring)
这不会捕获奇数反斜杠序列,如\\\,但会捕获其他任何内容:
\\\
解决办法不错。它看起来很难看,因为问题是丑陋的-你有损坏的数据。它当然简单,优雅,有效。只有当子字符串\\'(这是三个字符,我没有转义任何内容)出现在任何地方,并且只有在连续斜杠的数量为偶数时,它才会失败。所以你的选择是:
\\'
if r"\\'" in originalstring
(\\\\)+
查看以下片段:
import json from json.decoder import JSONDecodeError s = r'"\'"' print(s) try: print(json.loads(s)) except JSONDecodeError as e: print(vars(e))
输出:
正确的做法是修复创建无效JSON文件的任何内容。但如果不可能的话,我想需要更换。但是您应该使用正则表达式,这样它就不会将\\'替换为\'。在这种情况下,第一个反斜杠是转义第二个反斜杠,而不是转义引号。消极的观察会阻止这种情况的发生。在
\'
import re newstring = re.sub(r"(?<!\\)\\'", "'", originalstring)
JSON standard定义了一组特定的valid 2-character escape sequences:},以及一个4个字符的转义序列来定义任何Unicode代码点,
\\
,\/
,\"
,\b
,\r
,\n
,\f
和{\uhhhh
(\u
加4个十六进制数字)。反斜杠和其他字符的任何其他序列都是无效的JSON。在如果您有一个JSON源代码,否则您无法修复,唯一的办法就是删除无效序列,就像您对
str.replace()
所做的那样,即使它有点脆弱(当引号前面有一个偶数的反斜杠序列时,它将中断)。在您也可以使用正则表达式,删除有效序列中未使用的任何反斜杠:
这不会捕获奇数反斜杠序列,如
^{pr2}$\\\
,但会捕获其他任何内容:解决办法不错。它看起来很难看,因为问题是丑陋的-你有损坏的数据。它当然简单,优雅,有效。只有当子字符串
\\'
(这是三个字符,我没有转义任何内容)出现在任何地方,并且只有在连续斜杠的数量为偶数时,它才会失败。所以你的选择是:if r"\\'" in originalstring
,如果是,则抛出一个错误。简单,安全,也许可以。在(\\\\)+
或其他内容使用带否定lookbehind的regex。在查看以下片段:
输出:
^{pr2}$正确的做法是修复创建无效JSON文件的任何内容。但如果不可能的话,我想需要更换。但是您应该使用正则表达式,这样它就不会将
\\'
替换为\'
。在这种情况下,第一个反斜杠是转义第二个反斜杠,而不是转义引号。消极的观察会阻止这种情况的发生。在相关问题 更多 >
编程相关推荐