У меня есть файл параметров формы
parameter-name parameter-value
где параметры могут быть в любом порядке, но есть только один параметр на строку. Я хочу заменить одно значение параметра-параметра на новое значение.
Я использую функцию замены строки, опубликованную ранее (Поиск и замена строки в файле в Python), чтобы заменить строку, использующую python string.replace (pattern, subst). Регулярное выражение, которое я использую, например, работает в vim, но не работает в string.replace. Вот регулярное выражение, которое я использую:
line.replace("^.*interfaceOpDataFile.*$/i", "interfaceOpDataFile %s" % (fileIn))
где interfaceOpDataFile - это имя параметра, которое я заменяю (/i для нечувствительного к регистру), а новое значение параметра - это содержимое переменной fileIn. Есть ли способ заставить python распознавать это регулярное выражение, или есть ли другой способ выполнить эту задачу? Спасибо заранее.
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
Вы ищете функцию re.sub.
import re
s = "Example String"
replaced = re.sub('[ES]', 'a', s)
print replaced
будет печатать axample atring
re.sub
функцию в качестве второго аргумента re.sub
. Эта функция будет вызываться с каждой подходящей подстрокой, и ее результат будет помещен в результат.
Как резюме
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
re.sub
определенно то, что вы ищете. И поэтому вы знаете, вам не нужны якоря и подстановочные знаки.
re.sub(r"(?i)interfaceOpDataFile", "interfaceOpDataFile %s" % filein, line)
сделает то же самое - сопоставление первой подстроки, которая выглядит как "interfaceOpDataFile" и заменяет ее.
interfaceOpDataFile SomeDummyFile.txt
и я захочу заменить его на: interfaceOpDataFile SomeUsefulFile.txt
Если я не interfaceOpDataFile SomeUsefulFile.txt
якоря, как заменить знаю, что я хочу получить избавиться от SomeDummyFile.txt
?
re.sub(r"(?i)(interfaceOpDataFile).*", r'\1 UsefulFile', line)
Это займет всю строку, захватит имя аргумента и добавит его обратно для замены.
flags=re.MULTILINE
в качестве последнего аргументаre.sub
, чтобы заставить это работать, что имеет смысл - читайте об этом в документации здесь