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'}]
"""
我有一个脚本可以处理从网络返回的数据 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'}]
"""