在文件中替换多个正则表达式字符串匹配
我想在一个文件中替换多个字符串。但是在下面的代码中,只有我最后一个键值对被替换了。我该如何在文件中替换所有的键值对呢?
fp1 = open(final,"w")
data = open(initial).read()
for key, value in mydict.items():
fp1.write(re.sub(key,value, data)
fp1.close()
3 个回答
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")
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()
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.escape
的调用确保了包含特殊字符的字符串被当作普通文本处理(没有奇怪的含义;-),而竖线在正则表达式中表示“或者”。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
语句。