【问题标题】:Replace single quotes in a string but not escaped single quotes替换字符串中的单引号但不转义单引号
【发布时间】:2020-11-01 20:31:27
【问题描述】:

我正在发出 Python API 获取请求并获取我在字符串中捕获的 JSON 结果。该字符串类似于包含字典的字符串文字:{'key1': 4, 'key2': 'I\'m home'}。我需要将其格式化为包含正确 JSON 对象的字符串文字,如下所示:{"key1": 4, "key2": "I\'m home"},以便我可以保存到 JSON 文件。

为此,我尝试使用带有negative look-ahead 的正则表达式来替换所有单引号(转义单引号除外),如下所示:

import re

#.... other codes
str = re.sub("'(!?\')", "\"", result) # result = "{'key1': 4, 'key2': 'I\'m home'}"
print (str)

但我得到了这个输出

{"key1": 4, "key2": "I"m home"}

而不是

{"key1": 4, "key2": "I\'m home"}

如何创建正则表达式,以便保留转义的单引号 \',并将所有其他引号替换为双引号。

【问题讨论】:

  • 所以你得到的不是 JSON 的 JSON 结果?
  • result = requests.get(url).json()。我从 Python requests.get() 对象方法获得结果,该方法名为 json()。但是结果是用单引号中的键返回的,当我将它复制到 json 文件时,Visual Studio 代码报告它不是正确的 json。
  • 这能回答你的问题吗? HTTP requests and JSON parsing in Python
  • 看来你什么都不用做,requests.get(url).json()已经解码JSON并返回一个Python数据结构。
  • 您可以使用import json; json.dumps(result)将其编码回JSON字符串,如果这是您想要的。或者您可以跳过解码并直接返回 JSON 字符串,而是使用 requests.get(url).raw

标签: python json python-requests python-re


【解决方案1】:

您需要一个否定的lookbehind,而不是一个否定的lookahead(“引号前没有反斜杠”):

result = '''{'key1': 4, 'key2': 'I\\'m home'}'''
print(re.sub(r"(?<!\\)'", '"', result))
#{"key1": 4, "key2": "I\'m home"}

【讨论】:

  • 这对我仍然不起作用。我仍然收到{"key1": 4, "key2": "I"m home"}。我刚刚在我的机器上试了一下。
  • 您的答案在某种程度上是正确的。在使用否定的lookbehind之前,我必须转义所有反斜杠。
猜你喜欢
  • 2012-05-30
  • 2011-05-11
  • 1970-01-01
  • 1970-01-01
  • 2019-06-13
  • 2023-04-02
相关资源
最近更新 更多