str.replace() 用 "char" 替换字符

str.replace() replace char with "char"

我有一个脚本可以处理从网络返回的数据 API。返回的数据是字典列表的字符串表示形式。

我知道 ast.literal_eval() 可以将字典的字符串表示形式转换为真实的。

数据看起来像这样(提醒:那些是字符串,不是字典):

new = [{"id": "L0", "tags": null, "disable": false},
       {"id": "L1", "tags": null, "disable": false},
       {"id": "L2", "tags": null, "disable": false}]

因为 'null' 和 'false' 没有用引号括起来,所以 ast.literal_eval() 失败并报错。如果我手动为上面的 null 和 false 添加引号,它会完美地工作。

我试图遍历字符串并将子字符串 null 和 false 修改为 "null" 和 "false",但它什么也没做:

for i in new:
    i.replace("null", "\"null\"")
    i.replace("false", "\"false\"")

如何修改这些子字符串以添加引号?如果可能的话,我宁愿修改现有列表 (new[]) 而不是创建一个新列表,但是如果我必须创建一个新列表才能让它工作,那么我会这样做。

您可以修改 运行 ast.literal_eval() 之前的数据,可能使用 re 模块:

import re
from ast import literal_eval
from pprint import pprint

s = """new = [{"id": "L0", "tags": null, "disable": false},
       {"id": "L1", "tags": null, "disable": false},
       {"id": "L2", "tags": null, "disable": false}]"""

s = re.sub('null', '"null"', s)
s = re.sub('false', '"false"', s)
s = re.sub('new\s*=\s*', '', s)

new = literal_eval(s)
pprint(new)

输出:

[{'disable': 'false', 'id': 'L0', 'tags': 'null'},
 {'disable': 'false', 'id': 'L1', 'tags': 'null'},
 {'disable': 'false', 'id': 'L2', 'tags': 'null'}]

@MarkS,如果new是字典列表的字符串表示,那么你也可以试试下面的代码。

from ast import literal_eval

new = '''[{"id": "L0", "tags": null, "disable": false},
       {"id": "L1", "tags": null, "disable": false},
       {"id": "L2", "tags": null, "disable": false}]'''

new = new.replace('false', '\"false\"')
new = new.replace('null', '\"null\"')

print(new)
"""
    [{"id": "L0", "tags": "null", "disable": "false"},
       {"id": "L1", "tags": "null", "disable": "false"},
       {"id": "L2", "tags": "null", "disable": "false"}]
"""

print(literal_eval(new))
"""
    [{'id': 'L0', 'tags': 'null', 'disable': 'false'}, {'id': 'L1', 'tags': 'null', 'disable': 'false'}, {'id': 'L2', 'tags': 'null', 'disable': 'false'}]
"""