Как удалить строки в файле, диапазон которых определяется с помощью регулярных выражений на python?

#python #regex #lines

#python #регулярное выражение #строки

Вопрос:

Я пытаюсь очистить серию текстовых файлов, удалив ненужные строки. Я хочу удалить строки, начинающиеся со строки, соответствующей регулярному выражению 1, и продолжать удалять, пока не будет найдена строка с регулярным выражением 2. Мне нужно сделать это с помощью python. Я уже делал это, используя команду sed, что-то вроде

sed -r '/regex1/,/regex2/d'

и мне повезло, но мне нужно что-то, что я могу запустить на компьютерах с Windows. Кроме того, я хочу, чтобы все решение использовало один язык вместо перехода между скриптами shell и python. У кого-нибудь есть какие-либо идеи или сообщения, на которые можно указать мне?

Комментарии:

1. A) Вы могли бы использовать cygwin для запуска sed в Windows. Б) Возможно, вы захотите взглянуть на re пакет python.

2. просто рекомендация: слева от каждого ответа ниже стоит большая буква «V». Если одно из них решило вашу проблему — как вы сказали, решило — просто щелкните по нему, чтобы дать понять, что это правильный ответ на ваш вопрос. На самом деле, попробуйте делать это на каждый заданный вами вопрос, и вы получите приемлемый ответ 🙂

Ответ №1:

Вы можете сделать это, используя re.DOTALL для . сопоставления новых строк:

 import re

pattern = re.compile(r"regex1.*?regex2", re.DOTALL)
  

Затем вы можете использовать pattern.sub("", data) для удаления строк.

Комментарии:

1. Не используйте это, если ваш файл действительно большой.

Ответ №2:

 import sys,re

reg_start = 'reg1'
reg_end = 'reg2'

to_print = 1

for line in sys.stdin.readlines():
    if re.search(reg_start, line):
        to_print = 0
    elif re.search(reg_end, line):
        to_print = 1

    if to_print:
        print line,
  

Ответ №3:

В perl есть оператор триггера, который можно использовать как :

 perl -ne "print unless /regex1/ .. /regex2/" file
  

вы могли бы преобразовать это в python, как это объясняется здесь