字符串替换的无错误版本

Bug free version of string substitution

我陷入了一个非常简单的问题,但经过一些调整后,我根本找不到一个简单有效的算法来解决这个问题。

基本上我有一个字符串,其中包含某些元素,例如:

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"

很抱歉出现这样的本机问题,但我应该如何解决这个问题并获得预期的输出?请注意,每个 key/value 的长度不是固定的,所以我不能这样做:

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

由于长度不固定,上面的代码还是有bug。

我清楚了吗?任何建议将不胜感激!

=======更新

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

您可以将 re.sublambda 一起使用:

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 中,您可以使用 dict.get 通过提供默认值来防止 KeyError

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