Если вы хотите использовать регулярное выражение для большего файла, используйте mmap.
import mmap
import re
from tempfile import NamedTemporaryFile
with open(ur_fn, 'r+') as tgt, NamedTemporaryFile(dir='/tmp', delete=False) as out:
mm=mmap.mmap(tgt.fileno(), 0)
fn=out.name
pat=re.compile(r'^(\s*zone "domain.*?)(?=^\s*zone|\Z)', flags=re.S | re.M)
for i, block, span in ((n, m.group(1), m.span()) for n,m in enumerate(pat.finditer(mm))):
if "domain2.com" in block:
continue
else:
out.write(block)
with open(fn) as inf:
print(inf.read()) # replace this with copying the file onto orig, etc
Затем скопируйте файл temp на свой оригинал.
Если ваш файл имеет абсолютный рисунок из 7 строк после цели - лучше всего подходит solution Padraic Cunningham. Если у вас есть переменные строковые блоки или что-то лучше описывается с помощью регулярного выражения, этот подход удобен.
За то, что вы работаете, попробуйте:
import mmap
import re
from tempfile import NamedTemporaryFile
name="new_domain2.com"
template='''\
zone "%s" {
type slave;
masters {108.61.190.64;};
allow-notify{108.61.190.64;};
allow-transfer {trusted;};
key-directory "/usr/local/etc/namedb/";
file "/usr/local/etc/namedb/nyctelecomm.com.external.signed";
};
'''
with open('/tmp/dms.txt', 'r+') as tgt, NamedTemporaryFile(dir='/tmp', delete=False) as out:
mm=mmap.mmap(tgt.fileno(), 0)
fn=out.name
pat=re.compile(r'^(\s*zone "domain.*?)(?=^\s*zone|\Z)', flags=re.S | re.M)
for i, block, span in ((n, m.group(1), m.span()) for n,m in enumerate(pat.finditer(mm))):
if re.match(r'zone "domain2\.com', block):
out.write(template % name)
else:
out.write(block)
Пожалуйста, проверьте https://regex101.com/r/wU4xF3/2. Я думаю, вам нужно совместить строку с «domain2» и до строки, которая начинается с необязательного пробела + '};' или конца строки. –