Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 字符串替换的无Bug版本_Python_String_Algorithm_Substitution - Fatal编程技术网

Python 字符串替换的无Bug版本

Python 字符串替换的无Bug版本,python,string,algorithm,substitution,Python,String,Algorithm,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 = "te

我陷入了一个相当直接的问题,但经过一些调整后,我根本找不到一个简单有效的算法来实现这一点

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

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]+的模式

您可以使用
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
来防止
键错误
,如果
\u dict
中不存在键,则提供默认值:

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

dict={“%1”:“%33”、“13”:“%14”、“14”、“15”、“15”:“%17”}
您的意思是:
dict={“%1”:“%33”、“13”:“%14”、“14”:“%15”、“15”:“%17”}
所有键都遵循%[0-9]+的模式吗?您的问题没有得到很好的约束,例如,输入中的%13与翻译表中的%13和%1都匹配。在回答问题之前,您需要在此处提供额外的说明,说明a)什么是边界,和/或b)当可以进行多个重叠替换时,请指定优先级顺序。@coldspeed Yes!很抱歉造成混淆。
new_l=re.sub('%\d+',lambda x:_dict.get(x.group(),x.group()),l)
以避免键错误?我没有得到dv…@PatrickArtner可能会添加
dict.get
解决方案。它假设所有键的形式都是
%\d+
,并且最贪婪的匹配是正确的匹配。这可能是一个很好的假设,但需要在问题和/或答案中澄清。@wim OP刚刚发布了一个澄清。好的,但现在已经澄清了,这是一个骗局。