我是Python的新手,这是我第一个替换word的脚本。
我的文件test.c
包含以下两行
printf("\nReboot not supported. Exiting instead.\n");
fprintf(stderr, "FATAL: operation not supported!\n");
现在我想分别用printf
和fprintf
替换//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,但无法在我的脚本中使用它。
任何人都知道如何解决它?
答案 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时首先获取print
或fprintf
:
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)
逐行传递文件并将输出打印到不同的文件。