代码之家  ›  专栏  ›  技术社区  ›  lllllllllllll

字符串替换的无缺陷版本[重复]

  •  3
  • lllllllllllll  · 技术社区  · 6 年前

    我陷入了一个相当直截了当的问题中,但是经过一些调整,我根本找不到一个简单有效的算法来完成这个任务。

    所以基本上我有一个字符串,它包含一些元素,例如:

    l = "test %1, %13, %14, %15"
    

    地图:

    dict = {"%1": "%33", "%13": "%14", "%14", "%15", "%15": "%17"}
    

    我想做以下事情:

    for k in dict.keys():
        l = l.replace(k, dict[k])
    

    所以我期待的是:

    l = "test %33, %14, %15, %17"
    

    但显然这是不可行的,因为键和值之间存在一些冲突。所以上面的代码将输出:

    l = "test %33, %17, %17, %17"
    

    对于这种本机问题很抱歉,但是我应该如何解决这个问题并获得预期的输出呢?请注意,每个键/值的长度不是固定的,因此我不能执行以下操作:

    m_idx = l_copy.find(key)
    l = l[:m_idx] + dict[key] + l[m_idx+len(key):]
    

    因为长度不固定,上面的代码仍然有问题。

    我明白了吗?任何建议都会非常感谢!

    更新=更新

    所以所有的键都遵循这个模式,即%[0-9]+。

    1 回复  |  直到 6 年前
        1
  •  6
  •   Ajax1234    6 年前

    你可以使用 re.sub 用一个 lambda :

    import re
    l = "test %1, %13, %14, %15"
    _dict = {"%1": "%33", "%13": "%14", "%14":"%15", "%15": "%17"}
    new_l = re.sub('%\d+', lambda x:_dict[x.group()], l)
    

    输出:

    'test %33, %14, %15, %17'
    

    你可以使用 dict.get 防止 KeyError 如果键不在 _dict :

    new_l = re.sub('%\d+', lambda x:_dict.get(x.group(), x.group()), l)