用python中的特定字符串替换完全匹配的单词

时间:2015-01-29 05:34:38

标签: python

我是Python的新手,这是我第一个替换word的脚本。

我的文件test.c包含以下两行

printf("\nReboot not supported.  Exiting instead.\n");
fprintf(stderr, "FATAL:  operation not supported!\n");

现在我想分别用printffprintf替换//printf//fprintf

这是我试过的

infile = open('path\to\input\test.c')
outfile = open('path\to\output\test.c', 'w')

replacements = {'printf':'//printf', 'fprintf':'//fprintf'}

for line in infile:
    for src, target in replacements.iteritems():
        line = line.replace(src, target)
    outfile.write(line)
infile.close()
outfile.close()

但是使用这个我得到了

fprintf//f//printf这是错误的。

因为解决方案看了answer,但无法在我的脚本中使用它。

任何人都知道如何解决它?

4 个答案:

答案 0 :(得分:5)

基本上你想将printf转换为// printf,将fprintf转换为// fprintf。如果是这种情况,那么这可能会有效,请尝试一下。

  outfile = open("test.c", 'r')
  temp = outfile.read()
  temp = re.sub("printf", "//printf", temp)
  temp = re.sub("f//printf", "//fprintf", temp)
  outfile.close()
  outfile = open("test.c","w")
  outfile.write(temp)
  outfile.close()

答案 1 :(得分:0)

python中的dict没有订购。因此,您无法保证在以下行中遍历dict时首先获取printfprintf

for src, target in replacements.iteritems():

在目前的情况下,首先会选择print,这就是您面临问题的原因。为了避免此问题,请使用orderdict或保留replacements的词条列表。

答案 2 :(得分:0)

这是它正在做的事情。字典没有排序(正如您可能认为的那样),因此fprintf替换实际上首先出现,然后替换它的printf部分。序列:

fprintf -> //fprintf -> //f//printf

答案 3 :(得分:0)

(?=\bprintf\b|\bfprintf\b)

使用re模块中的re.sub。参见演示。

https://regex101.com/r/pM9yO9/18

import re
p = re.compile(r'(?=\bprintf\b|\bfprintf\b)', re.IGNORECASE | re.MULTILINE)
test_str = "printf(\"\nReboot not supported. Exiting instead.\n\");\nfprintf(stderr, \"FATAL: operation not supported!\n\");"
subst = "//"

result = re.sub(p, subst, test_str)

逐行传递文件并将输出打印到不同的文件。