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

Просто для полноты, как никто не упомянул об этом. Третий параметр для среза массива - это шаг. Таким образом, реверсирование строки так же просто, как:

some_string[::-1]

Или выбор альтернативных символов будет:

"H-e-l-l-o- -W-o-r-l-d"[::2] # outputs "Hello World"

Возможность переходить вперед и назад по строке поддерживает согласованность с тем, способный массировать срез с начала или конца.

37
задан stuxnetting 12 March 2018 в 05:57
поделиться

3 ответа

Regular-expressions.info содержит страницу Удаление повторяющихся строк из файла

Это в основном сводится к поиску этого единственного слова:

^(.*)(\r?\n\1)+$

... И замене на \ 1 .
Примечание: точка не должна соответствовать новой строке

Объяснение:

Каретка будет соответствовать только в начале строки. Таким образом, механизм регулярных выражений будет пытаться сопоставить только оставшуюся часть регулярного выражения. Комбинация точки и звезды просто соответствует всей строке, независимо от ее содержимого, если оно есть. Скобки сохраняют совпавшую строку в первой обратной ссылке.

Затем мы сопоставим разделитель строк. Я поставил вопросительный знак в \ r? \ N , чтобы это регулярное выражение работало как с Windows ( \ r \ n ), так и с UNIX ( \ n ) текстовые файлы. Итак, до этого момента мы сопоставляли строку и следующий разрыв строки.

Теперь нам нужно проверить, следует ли за этой комбинацией дубликат той же строки. Мы делаем это просто с помощью \ 1 . Это первая обратная ссылка, которая содержит строку, которую мы сопоставили. Обратная ссылка будет соответствовать тому же самому тексту.

Если обратная ссылка не соответствует, совпадение регулярного выражения и обратная ссылка отбрасываются, и механизм регулярных выражений пытается снова в начале следующей строки. Если обратная ссылка прошла успешно, символ плюс в регулярном выражении попытается сопоставить дополнительные копии строки. Наконец, символ доллара заставляет механизм регулярных выражений проверять, является ли текст, соответствующий обратной ссылке, полной строкой. Мы уже знаем, что тексту, соответствующему обратной ссылке, предшествует разрыв строки (соответствует \ r? \ N). Поэтому теперь мы проверяем, следует ли за ним разрыв строки или он находится в конце файла, используя знак доллара .

Все совпадение становится строкой \ nline ] (или строка \ nline \ nline и т. д.). Поскольку мы выполняем поиск и замену, строка, ее дубликаты и разрыв строки между ними удаляются из файла. Так как мы хотим сохранить исходную строку, но не дубликаты, мы используем \ 1 в качестве текста замены, чтобы вернуть исходную строку.

83
ответ дан 27 November 2019 в 01:24
поделиться

См. Мой запрос для получения дополнительной информации, я сейчас отвечаю простым способом .

  1. Если порядок не имеет значения, просто сортировка

    -u

    поможет

  2. Если порядок имеет значение, но вы не против повторного выполнения нескольких проходов (это синтаксис vim), вы можете использовать:

    % s / \ (. * \ ) \ (\ _. * \) \ (\ 1 \) / \ 2 \ 1 / g

    , чтобы сохранить последнее вхождение, или

    % s /\(.*\)\(\_.* \) \ (\ 1 \) / \ 1 \ 2 / g

    , чтобы сохранить первое вхождение.

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

РЕДАКТИРОВАТЬ: в вашем редактировании вы были не очень ясны, но похоже, что вы хотите всего лишь за один проход удалить повторяющиеся СЛЕДУЮЩИЕ строки! Что ж, это намного проще!

Простой:

/(.*)\1*/\1/

( / \ (. * \) \ 1 * / \ 1 / в vim) то есть поиск (.

5
ответ дан 27 November 2019 в 01:24
поделиться

В RegexBuddy вы можете сделать это следующим образом:

  1. На вкладке «Библиотека» загрузите библиотеку RegexBuddy.rbl, если она не загружена по умолчанию.
  2. В поле поиска введите «duplicate»
  3. Нажмите кнопку «Использовать», чтобы загрузить регулярное выражение «удалить повторяющиеся строки».
  4. На вкладке GREP укажите папку и маску файлов, дубликаты которых вы хотите удалить.
  5. В раскрывающемся меню кнопки GREP выберите «Выполнить».

Если вы делаете это только с одним файлом, вы можете использовать вкладку «Тест» вместо вкладки GREP. Загрузите файл на вкладке «Тест», а затем нажмите кнопку «Заменить» на главной панели инструментов.

4
ответ дан 27 November 2019 в 01:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: