我想在文件中替换多个字符串。替换文件中的多个字符串
fp1 = open(final,"w")
data = open(initial).read()
for key, value in mydict.items():
fp1.write(re.sub(key,value, data)
fp1.close()
但只有我的最后一个键值被替换。我怎样才能替换文件中的所有键,值。 有没有更好的方法来替换文件中的多个字符串。
感谢
`
我想在文件中替换多个字符串。替换文件中的多个字符串
fp1 = open(final,"w")
data = open(initial).read()
for key, value in mydict.items():
fp1.write(re.sub(key,value, data)
fp1.close()
但只有我的最后一个键值被替换。我怎样才能替换文件中的所有键,值。 有没有更好的方法来替换文件中的多个字符串。
感谢
`
这应该会更好。
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()
此方法将在将“blog”更改为“bLOG”时字典是'{“log”:“LOG”}'当然这是假设OP要改变每一次出现,不管一个单词是否处于边界或不在。 – ghostdog74 2010-03-06 14:56:11
**错误**答案呃:'data.replace' **不会改变数据'至少(字符串是不可变的!!!)。 – 2010-03-06 17:08:29
是的,我纠正了错误。 – gruszczy 2010-03-06 20:03:05
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")
这是一个任务,为它的正则表达式可以真正帮助:
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
语句的使用。
谢谢,我的投票!这是我发现的处理重叠替换文本的唯一答案。即。 {'k1':'k2','k2':'k1'} – hopia 2011-01-25 23:11:43
您的代码不起作用,因为您直接将结果写入文件,因此它会多次输出数据。 如果你用'data = re.sub(key,value,data)'替换'fp1.write(re.sub(key,value,data)''它可以。 另外,是否有特定的原因使用're.sub'而不是'data.replace(key,value)' – Wolph 2010-03-06 13:42:13
@WoLpH:为什么不把它作为答案? – 2010-03-06 13:46:30
我不认为只是在同一组数据上调用replace是最好的解决方案,尽管我对这里最适合的解决方案有所怀疑 另外,由于它是一个就地替换,因此无论如何都可以更好地进行流式传输。 – Wolph 2010-03-06 14:31:28