用双引号(")替换单引号('),但不包括撇号。

4

我有一个数据集,其中包含无效的json格式,如下所示:

{'id': 613, 'name': "new year's eve"}

我想替换所有单引号,但不包括撇号,例如:new year's。因此,上面的字符串应该生成有效的 JSON,如下所示:

{"id": 613, "name": "new year's eve"}

我曾经在Python中尝试过简单的字符串替换:string.replace("'", "\""),但这样做也会改变撇号,导致结果为:

{"id": 613, "name": "new year"s eve"}

有没有一种用正则表达式来解决这个问题的方法,比如“替换所有',除非它被“封装起来”?

我之前尝试过那个解决方案,但在我的情况下它不起作用,因为它会导致无效的JSON。 - user3190748
2个回答

2
你可以使用 ast 模块。 示例:
import ast

s = """{'id': 613, 'name': "new year's eve"}"""
d = ast.literal_eval(s)
print(d)

请注意不要在用户输入上运行此代码,这是危险的,因为它可能允许用户在系统上运行任意代码。 - NicolasZ
@NicolasZ,那是不安全的eval - Rakesh

1
你可以尝试一下。
'(\w+)'\s*:

查看 regex101.com上的演示


Python 中:

import json, re

string = """{'id': 613, 'name': "new year's eve"}"""

rx = re.compile(r"""'(\w+)'\s*:""")
string = rx.sub(r'"\1":', string)
d = json.loads(string)
print(d)

这将产生:
{'id': 613, 'name': "new year's eve"}

更好的是:这个字符串最初来自哪里?

谢谢回复。这不起作用,因为它匹配引号之间的文本。我只想将 ' 更改为 ",除非 ' 用于像 year's 这样的单词中。 - user3190748
@Cid:我非常清楚它不是完美的。 - Jan
1
更好的做法是:这个字符串最初来自哪里呢?这个问题应该被回答。你不应该在接收到无效的JSON后再去修复它。 - Cid
@Cid:确实如此。但是,OP可能无法访问原始的数据处理管道。 - Jan
这个JSON是我从第三方获得的一个庞大数据集,我无法访问处理管道。 - user3190748
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接