2017-02-18 4 views
3

Если у меня есть содержимое файла, как это:Python: Заменить строку как переменную в файле

old_string 
-old_string 

Я только хочу, чтобы изменить «old_string» быть «+ new_string», так что результат выглядит

+new_string 
-old_string 

мой код дает этот результат:

+new_string 
-+new_string 

Это мой код:

with open(filename) as f: 

    s = f.read() 

    if old_string not in s: 

     return False 

with open(filename, 'w') as f: 

    s = s.replace(old_string, new_string) 

    f.write(s) 

    return True 

я Пробовал регулярное выражение, но это не будет работать, так как я прохожу регулярное выражение в качестве переменных, это то, что я сделал до сих пор:

with open (filename, 'r') as f: 

     content = f.read() 

content_new = re.sub('(\%old_string)', r'\new_string'%(old_string,new_string), content, flags = re.M)  
+0

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

+0

@Adam - Очень понравилось бы, если бы вы отметили ответ, который помог вам решить вашу проблему как правильный ответ :-) – kkaosninja

ответ

-1

Это будет работать для вас: -

import re 
with open("output.txt", "a") as myfile: 

    with open('input.txt') as f: 
     lines = f.readlines() 
     for line in lines: 
      # print str(line) 
      ret = re.sub(r"(\s|^|$)old_string(\s|^|$)",r" +new_string ",line) #It will replace if line contain 'old_string' by '+new_string' 
      # print ret 
      myfile.write(ret+'\n') 

Примечание: - Проверьте output.txt

+0

где вы указали «old_string»? – Adam

+0

@Adam 'Строка ввода' - это ваша« старая строка ». –

+0

@ Adam, проверьте, что у меня есть обновление, и попробуйте запустить это, заменив ваше имя файла. –

1

Синтаксис откусил; Вы, вероятно, хотите сделать что-то больше, как это:

import re 

test_str = ("old_string\n" 
      "-old_string") 

match = "old_string" 
subst = "+new_string" 

regex = r"^{}".format(match) 

# You can manually specify the number of replacements by changing 
# the 4th argument 

result = re.sub(regex, subst, test_str, 0) 

if result: 
    print (result) 

# Note: for Python 2.7 compatibility, use ur"" to prefix 
# the regex and u"" to prefix the test string and substitution. 

^ утверждение в шаблоне то, что я рекомендую использовать, так как это указывает на строку, чтобы соответствовать должна начинаться в самом начале строки, таким образом, выиграл» t соответствует -old_string.

1

Вы можете просто проигнорировать строки, в которых есть дефис («-») в начале, и заменить остальные.

Скрипт ниже немного отличается от вашего. Я добавил комментарии, чтобы помочь вам понять. Это должно быть легко понять.

filename ="some_file" 
output_filename = "some_other_file" 

old_string = "old_string" 
new_string = "+new_string" 

input_file_handle = open(filename,"r") # File being opened in read mode 
output_file_handle = open(output_filename, "w") # File being opened in write mode 

# Read in input file line by line 
for line in input_file_handle: 

    # Write to output file and move on to next line 
    if old_string not in line: 
     output_file_handle.write(line+"\n") 
     continue 

    # This line contains the old_string. We check if it starts with "-". 
    # If it does, write original line and move on to next line 
    if line.startswith("-"): 
     output_file_handle.write(line+"\n") 
     continue 


    # At this stage we are absolutely sure we want to replace this line's contents 
    # So we write the replaced version to the new file 
    output_file_handle.write(new_string+"\n") 


# Close both file handles 
input_file_handle.close() 
output_file_handle.close() 
1

Выгода для моего решения является то, что он не опирается на "делать-не-замены" префикс находится в начале строки.

Если вы хотите, чтобы решить эту проблему без регулярных выражений, которые вы могли бы написать свой собственный заменить метод:

replace.txt:

old_string 
-old_string 

old_string -old_string --old_string old_string 

replace.py:

import sys 
import fileinput 

def replace_exclude(string, search, replace="", excluding_char='-'): 
    # Does replace unless instance in search string is prefixed with excluding_char. 
    if (not string) or (not search): return None 
    for i in range(len(string)): 
     while string[i-1] == excluding_char: 
      i += 1 
     if i < len(string): 
      for j in range(len(search)): 
       possible = True 
       if not (string[i + j] == search[j]): 
        possible = False 
        break 
     if possible: 
      string = string[0:i] + replace + string[i+len(search):] 
      i += len(replace) 
    return string 

filename = "replace.txt" 

for line in fileinput.input([filename], inplace=True): 
    sys.stdout.write(replace_exclude(line, "old_string", "+new_string")) 

replace.txt после запуска replace.py:

+new_string 
-old_string 

+new_string -old_string --old_string +new_string 
+0

Привет, Грег, Будет ли это работать на python 2.7? Я получаю ошибку в печати (replace_exclude (строка, "old_string", "+ new_string"), end = '') – Adam

+0

О, нет, я разрабатываю в Python 3, и я рекомендую вам перейти на него. Если вам нужны конкретные ответы в старом, устаревшем, устаревшем Python 2, тогда вы должны пометить свой вопрос конкретно 'python2.x' или' python2.7'. –

+0

В качестве отступления я должен сказать, что мое утверждение о том, что Python 2 является наследием, должно подтверждаться доказательствами: https://wiki.python.org/moin/Python2orPython3 –

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