Python string.replace регулярное выражение [duplicate]

241

У меня есть файл параметров формы

parameter-name parameter-value

где параметры могут быть в любом порядке, но есть только один параметр на строку. Я хочу заменить одно значение параметра-параметра на новое значение.

Я использую функцию замены строки, опубликованную ранее (Поиск и замена строки в файле в Python), чтобы заменить строку, использующую python string.replace (pattern, subst). Регулярное выражение, которое я использую, например, работает в vim, но не работает в string.replace. Вот регулярное выражение, которое я использую:

line.replace("^.*interfaceOpDataFile.*$/i", "interfaceOpDataFile %s" % (fileIn))

где interfaceOpDataFile - это имя параметра, которое я заменяю (/i для нечувствительного к регистру), а новое значение параметра - это содержимое переменной fileIn. Есть ли способ заставить python распознавать это регулярное выражение, или есть ли другой способ выполнить эту задачу? Спасибо заранее.

Теги:

4 ответа

362
Лучший ответ

str.replace() v2 |v3 не распознает регулярные выражения.

Чтобы выполнить подстановку с использованием регулярного выражения, используйте re.sub() v2 |v3.

Например:

import re

line = re.sub(
           r"(?i)^.*interfaceOpDataFile.*$", 
           "interfaceOpDataFile %s" % fileIn, 
           line
       )

В цикле было бы лучше сначала скомпилировать регулярное выражение:

import re

regex = re.compile(r"^.*interfaceOpDataFile.*$", re.IGNORECASE)
for line in some_file:
    line = regex.sub("interfaceOpDataFile %s" % fileIn, line)
    # do something with the updated line
  • 6
    Я должен был передать flags=re.MULTILINE в качестве последнего аргумента re.sub , чтобы заставить это работать, что имеет смысл - читайте об этом в документации здесь
  • 6
    Компиляции regex кэшируются ( документы ), поэтому компиляция даже не требуется. Но, как вы показываете, если один компилируется, компилируется вне цикла.
226

Вы ищете функцию re.sub.

import re
s = "Example String"
replaced = re.sub('[ES]', 'a', s)
print replaced 

будет печатать axample atring

  • 0
    Можно ли заменить регистром в одной строке, например, если первым символом является E, заменить на G, если Z, например, изменить на B.
  • 0
    Вы можете передать строку -> re.sub функцию в качестве второго аргумента re.sub . Эта функция будет вызываться с каждой подходящей подстрокой, и ее результат будет помещен в результат.
Показать ещё 1 комментарий
10

Как резюме

import sys
import re

f = sys.argv[1]
find = sys.argv[2]
replace = sys.argv[3]
with open (f, "r") as myfile:
     s=myfile.read()
ret = re.sub(find,replace, s)   # <<< This is where the magic happens
print ret
8

re.sub определенно то, что вы ищете. И поэтому вы знаете, вам не нужны якоря и подстановочные знаки.

re.sub(r"(?i)interfaceOpDataFile", "interfaceOpDataFile %s" % filein, line)

сделает то же самое - сопоставление первой подстроки, которая выглядит как "interfaceOpDataFile" и заменяет ее.

  • 0
    Мне нужно заменить всю строку, потому что исходный файл будет иметь что-то вроде: interfaceOpDataFile SomeDummyFile.txt и я захочу заменить его на: interfaceOpDataFile SomeUsefulFile.txt Если я не interfaceOpDataFile SomeUsefulFile.txt якоря, как заменить знаю, что я хочу получить избавиться от SomeDummyFile.txt ?
  • 1
    Ах, я неправильно понял, что вы делали с заменой. Если каждая пара находится на отдельной линии, вам все еще не нужна простота привязки. re.sub(r"(?i)(interfaceOpDataFile).*", r'\1 UsefulFile', line) Это займет всю строку, захватит имя аргумента и добавит его обратно для замены.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню