2015-01-29 4 views
2

Я совершенно новичок в Python, и это мой первый скрипт для замены слова.Заменить точное совпадающее слово с определенной строкой в ​​python

мой файл 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, но не смогли поместить его в мой скрипт.

У кого-нибудь есть идея, как я могу это исправить?

ответ

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() 
+0

Спасибо, он отлично работает. –

0

dict in python не заказывается. так что вы не можете гарантировать print или fprintf будет подобран первым во время прохождения Dict в следующей строке:

for src, target in replacements.iteritems(): 

В данном случае, print выглядит ковыряться первые Вот почему вы столкнулись с проблемой. Чтобы избежать проблемы, используйте либо orderdict, либо сохраните список dicts для replacements.

+0

Как использовать 'Orderdict'? Попробовали 'OrderedDict (sorted (replacements.items(), key = lambda t: t [0]))', но получая ошибку для неопределенного 'OrderedDict'. –

0

Вот что он делает. Словари не заказываются (как вы думаете, они есть), поэтому замена fprintf действительно на первом месте, а затем она заменяет часть printf. Последовательность:

fprintf -> //fprintf -> //f//printf 
+0

Итак, как я могу избежать этого? –

+0

Использование orderdict, как упомянуто выше, позволит вам использовать словарь, который придерживается ключевого заказа, с которым он был введен, или вместо этого вы можете использовать список. Должно решить проблему. –

+0

@Jayesh, чтобы избежать этого, вы можете перечислить или вместо кортежа вместо dict '[('printf', '// printf'), ('fprintf', '// fprintf')]' – dragon2fly

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

Использование re.sub от повторного module.See демо.

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) 

Пройди свой файл построчно и вывода на печать в другой файл.

Смежные вопросы