我想使用for循环来使用 string.replace 。这是我的代码:
new = ['p','q','r']
my_str = 'there are two much person a, person b, person c.'
old = ['a','b','c']
for i in range(0,len(old)):
my_str = string.replace(my_str,old[i],new[i])
print(my_str)
但它给了我错误:
TypeError:'str'对象不能解释为整数
期望的输出:
有两个人p,人q,人r。
这只是一个例子,我想为10,000个长度列表运行for循环。
答案 0 :(得分:2)
尝试
new = ['p','q','r']
my_str = 'there are two much person a, person b, person c.'
old = ['a','b','c']
for i in range(len(old)):
my_str = my_str.replace(old[i],new[i])
print(my_str)
但这可能不是很快
如果旧的条目都是字母,则可以
import re
new = ['p','q','r']
my_str = 'there are two much person a, person b, person c.'
old = ['a','b','c']
word=re.compile(r"\w*") # word characters
old_new=dict(zip(old,new))
ong=old_new.get
my_str=word.sub((lambda s:ong(s,s)),my_str)
print(my_str)
如果条目既旧又新(在较短的解决方案中不可避免),这也避免了双重替换问题
答案 1 :(得分:2)
实际上,我无法重现你的问题;你的代码在Python 2.7上运行良好。但是,有更好的方法来做到这一点。首先,您可以range
zip
和old
列表,而不是使用new
:
for i in range(0,len(old)):
my_str = string.replace(my_str,old[i],new[i])
但是,这仍然会取代a
中的are
和c
中的much
,它也可能会替换先前替换中引入的字符,可能不是你想要的。相反,您可以使用re
模块,将要替换为|
的字符串连接到正则表达式,并使用\b
字边界字符对其进行分隔,例如在您的情况下\b(a|b|c)\b
,并使用字典查找正确的替换。
d = dict(zip(old, new))
p = r'\b(' + '|'.join(old) + r')\b'
my_str = re.sub(p, lambda m: d.get(m.group()), my_str)
结果:there are two much person p, person q, person r.
答案 2 :(得分:1)
string.replace()
在Python 2.x上可用,但在python 3.x中已弃用。
以下是如何在Python 3.x中使用它
str.replace(old,new [,count]) 返回字符串的副本,其中所有出现的substring old都替换为new。如果给出了可选参数计数,则仅替换第一次计数出现次数。
在您的情况下,它是my_str.replace(old[index], new[index])