在文件中替换多个正则表达式字符串匹配

2 投票
3 回答
5345 浏览
提问于 2025-04-15 20:05

我想在一个文件中替换多个字符串。但是在下面的代码中,只有我最后一个键值对被替换了。我该如何在文件中替换所有的键值对呢?

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 语句。

撰写回答