2014-01-02 2 views
1

Я задавался вопрос, как я могу сделать Python игнорировать символы внутри двойных кавычек (") в моем поиске и замены Моего кода:Игнорировать символы в кавычках внутри находки и заменить алгоритм

def findAndReplace(textToSearch, textToReplace,fileToSearch): 
    oldFileName = 'old-' + fileToSearch 
    tempFileName = 'temp-' + fileToSearch 
    tempFile = open(tempFileName, 'w') 
    for line in fileinput.input(fileToSearch): 
     tempFile.write(line.replace(textToSearch, textToReplace)) 
    tempFile.close() 
    # Rename the original file by prefixing it with 'old-' 
    os.rename(fileToSearch, oldFileName) 
    # Rename the temporary file to what the original was named... 
    os.rename(tempFileName, fileToSearch) 

Предположим, что наш файл (test.txt) имеет содержание (ЭТО нАШЕ АКТУАЛЬНО TEXT):

Мне нравится ваш код «Мне нравится ваш код»

и я исполню

findAndReplace('code','bucket',test.txt) 

, который будет написать следующее в мой файл:

Мне нравится ведро «Мне нравится ваше ведро»

Однако, я хочу, чтобы пропустить двойные кавычки части и получить это как в результате

Мне нравится ведро «Мне нравится ваш код»

Что я должен добавить к моему исходному коду?

Заранее спасибо

+1

Может ли быть кавычки внутри кавычек? Другими словами, «нравится ли мне ваш код», мне нравится «ваш код», «на самом деле есть две строки с кавычками», «Мне нравится» и «» «или одна цитата» «Мне нравится« ваш код »" '? – abarnert

+0

Это содержимое текстового файла, если я понимаю, что вы только что упоминали – bolzano

+0

Не думаю, что вы понимаете, о чем я только что упомянул, потому что вы не ответили на мой вопрос. Но я предполагаю, что вы хотели бы рассматривать пример как первый, а не второй. – abarnert

ответ

4
haystack = 'I like your code "I like your code"' 
needle = "code" 
replacement = "bucket" 

parts = haystack.split('"') 
for i in range(0,len(parts),2): 
    parts[i] = parts[i].replace(needle,replacement) 

print '"'.join(parts) 

Предполагая, что вы не можете иметь вложенные кавычки ...

+0

В основном то же самое, что и мой ответ, и вы попали туда сначала ... но я думаю, что проще использовать нарезку и назначение среза для изменения четных битов вместо их изменения по одному. – abarnert

+0

спасибо! – bolzano

1

Если вам не нужно обрабатывать кавычки внутри кавычек или что-нибудь подобное, это довольно легко. Вы можете сделать это с помощью регулярных выражений. Но, так как я предполагаю, что вы не знаете regexp (или вы бы использовали его в первую очередь), давайте сделаем это с помощью простых методов строк: ваша строка на символах цитат, затем replace только четные подстроки, затем join его обратно вместе:

for line in fileinput.input(fileToSearch): 
    bits = line.split('"') 
    bits[::2] = [bit.replace(textToSearch, textToReplace) for bit in bits[::2]] 
    tempFile.write('"'.join(bits)) 
Смежные вопросы