字符串替换的无错误版本
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.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
中,您可以使用 dict.get
通过提供默认值来防止 KeyError
:
new_l = re.sub('%\d+', lambda x:_dict.get(x.group(), x.group()), l)
我陷入了一个非常简单的问题,但经过一些调整后,我根本找不到一个简单有效的算法来解决这个问题。
基本上我有一个字符串,其中包含某些元素,例如:
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.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
中,您可以使用 dict.get
通过提供默认值来防止 KeyError
:
new_l = re.sub('%\d+', lambda x:_dict.get(x.group(), x.group()), l)