【问题标题】:str.replace() replace char with "char"str.replace() 将 char 替换为 "char"
【发布时间】:2018-07-12 14:53:25
【问题描述】:

我有一个脚本可以处理从 Web 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[]) 而不是创建一个新列表,但如果我必须创建一个新列表才能使其正常工作,那么我将这样做。

【问题讨论】:

  • 我假设你的意思是 None 和 False?
  • @MarkS,如果 new 是一个字符串,那么你的方法有点正确。不要使用 for 循环。只需 2 行就足够了。也不要忘记在替换操作后重新分配返回的值。请注意,字符串在 Python 中是不可变的。例如,i = i.replace("null", "\"null\"")

标签: python-3.x python-3.6 str-replace


【解决方案1】:

@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'}]
"""

【讨论】:

  • 我认为我的问题有点不清楚。该列表是一个列表,但列表的值是看起来像 dicts 的字符串。这就是为什么我说我正在尝试 for i in new:我正在迭代实际列表 new 中的每个字符串。
【解决方案2】:

您可以在运行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'}]

【讨论】:

  • 我认为我的问题有点不清楚。该列表是一个列表,但列表的值是看起来像 dicts 的字符串。这就是为什么我说我正在尝试 for i in new:我正在迭代实际列表 new 中的每个字符串。
  • @MarkS 您需要在问题中提供原始输入和预期输出。
  • kesley,在稍微调整我的程序以适应您提供的解决方案后,我让它按照我想要的方式工作。我现在成功创建了一个字典列表。谢谢。
猜你喜欢
  • 1970-01-01
  • 2010-10-12
  • 2021-04-29
  • 2013-10-18
  • 2012-01-15
  • 2020-11-25
  • 1970-01-01
  • 1970-01-01
  • 2011-06-08
相关资源
最近更新 更多