我正在尝试替换文件中的多个字符串。
fp1 = open(final,"w")
data = open(initial).read()
for key, value in mydict.items():
fp1.write(re.sub(key,value, data)
fp1.close()
但只有我的最后一个键值被替换。如何替换文件中的所有键值。 有没有更好的方法来替换文件中的多个字符串。
由于
`
答案 0 :(得分:5)
这是正则表达式真正有用的一项任务:
import re
def replacemany(adict, astring):
pat = '|'.join(re.escape(s) for s in adict)
there = re.compile(pat)
def onerepl(mo): return adict[mo.group()]
return there.sub(onerepl, astring)
if __name__ == '__main__':
d = {'k1': 'zap', 'k2': 'flup'}
print replacemany(d, 'a k1, a k2 and one more k1')
作为主脚本运行,根据需要打印a zap, a flup and one more zap
。
这当然关注字符串,而不是文件 - 替换本身就是在字符串到字符串的转换中发生的。基于RE的方法的优点是减少了循环:由于正则表达式引擎,所有要替换的字符串在一次传递中匹配。 re.escape
调用确保包含特殊字符的字符串被视为文字(没有奇怪的含义;-),垂直条表示RE模式语言中的“或”,sub
方法调用嵌套每个匹配的onerepl
函数,传递匹配对象,以便.group()
调用轻松检索刚匹配且需要替换的特定字符串。
要在文件级别工作,
with open(final, 'w') as fin:
with open(initial, 'r') as ini:
fin.write(replacemany(mydict, ini.read()))
建议使用with
语句,以确保正确关闭文件;如果你坚持使用Python 2.5,请在模块或脚本的开头使用from __future__ import with_statement
来使用with
语句。
答案 1 :(得分:0)
这应该更好。
fp1 = open(final,"w")
fp2 = open(initial, 'r')
data = fp2.read()
fp2.close()
for key, value in mydict.items():
data = data.replace(key, value)
fp1.write(data)
fp1.close()
答案 2 :(得分:0)
fp1 = open("final","w")
fp2 = open("file", 'r')
for line in fp2:
sline=line.rstrip().split()
for n,item in enumerate(sline):
if item in d:
sline[n]=d[item]
fp1.write(' '.join(sline) +"\n")