Skip to content

Latest commit

 

History

History
217 lines (152 loc) · 16.1 KB

practicum-notepadplusplus.md

File metadata and controls

217 lines (152 loc) · 16.1 KB

Работа с текстом в продвинутом текстовом редакторе

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

Что понадобится: NotePad++
Владельцы Mac-ов и компьютеров на Linux используют аналоги из списка.
(Обратите внимание: Обычный Блокнот (NotePad), Word и прочие офисные редакторы для этого практикума не годятся).

1. Кодировки

Типы кодировок текста для русского языка:

  • Unicode (UTF-8 без цифровой подписи BOM и с нею) - основная кодировка для автоматической обработки текстовых файлов
  • Cyrillic Windows (cp1251) - кодировка компании Microsoft для Windows
  • KOI8-R, DOS, ... - более старые форматы
  • ASCII (American Standard Code for Information Interchange) - предок всех вышеупомянутых

Упражнение

  1. Откройте файл dovlatov3.utf8.txt.
    В меню "Кодировки" замените текущую на Windows-1251, затем обратно на UTF-8 без BOM.

Если вы открываете файл и видите "кракозябры", то с помощью меню "Кодировки" можно подобрать правильную.

"Преобразовать в...": переводит файл в другую кодировку (затем файл нужно сохранить). Windows-1251 называется ANSI.
"Открыть в другой кодировке" и "преобразовать в кодировку" - разные команды (подумайте, почему).

Mac/BBedit: настроить кодировку: меню Файл/File - Перезагрузить с помощью кодировки...
Кодировка файла меняется с помощью меню Файл - Сохранить как... - Encoding

2. Вид → Отображение символов и Перенос строк

В меню Отображение символов отметьте чекбоксы: (а) отображать пробелы и табуляции, (b) отображать символы конца строки ((c) отображать все символы). Перенос строк (text wrap) автоматически переносит текст на новую строку, как в Word. Видимые концы строк при этом не сохраняются (являются "мягкими", то есть вычисляются редактором по специальному алгоритму).

Mac/BBedit: меню Вид/View - Text Display - Show Invisibles

3. Формат конца строки

Непечатаемые символы, обозначающие конец строки:

  • формат Windows: CR+LF \r\n
  • формат Mac (старый): CR \r
  • формат UNIX: LF \n

В режиме отображения символов конца строки вы увидите "СR", "LF", которые при поиске и замене в расширенном режиме и в режиме регулярных выражений задаются как эскейп-символы \r, \n, соответственно.

Mac/BBedit: формат конца строки меняется с помощью меню Файл - Сохранить как... - Конец строки

4. Поиск и замена

Меню для поиска и замены доступно по горячей клавише Ctrl+F (см. также меню Поиск и замена или Правка, в зависимости от редактора)
Отмена операции: Ctrl+Z
По умолчанию, в NotePad++ поиск происводится начиная с текущей позиции курсора до конца файла, включите чекбокс "Зациклить поиск", чтобы замена проводилась по всему файлу.
Поиск у учетом регистра и без: прописные и строчные буквы будут различаться (орел и Орел).

Mac/BBedit: поиск Command+F или меню Поиск/Search. Отмена операции: Command+Z. 
Зациклить поиск: Wrap around. Поиск с учетом регистра: Case sensitive

Упражнение

  1. Найдите все вхождения отрицания не.
  2. Замените их на НЕ.
  3. Отмените последнюю операцию.

5. Режим поиска "Регулярные выражения"

  • Специальные символы: экскейп-символ \t (табуляция), \n, \r\n (символы конца строки, см. выше).

  • ^ - начало строки, $ - конец строки

  • к[аоиу]т - найдет кат, кот, кит, кут

  • [а-яё] - найдет все буквы русского алфавита

  • [0-9a-z@_.] - все знаки, допустимые в адресе электронной почты

Узнайте, есть ли в тексте латинские буквы?

  • [^а-я] - "крышка" обозначает НЕ, т. е. все символы, кроме указанного диапазона а-я

  • [^!]$- найдет концы абзацев, не заканчивающиеся на восклицательный знак

  • е+ - найдет е, ее, еее...

  • [нм]+ - найдет сочетания нн, мм, нм, мн, ммм, нннн, мнннннм...

  • . - любой символ

  • .+ - повтор (любого символа) 1 или более раз

  • .* - повтор (любого символа) 0 или более раз

  • л.+ - найдет букву л и далее все символы до конца строки

  • л[а-яё]+ - что найдется здесь?

  • ˽я[а-яё]* - (в начале пробел) найдет слова, начинающиеся с я, в том числе слово я

Этот поиск "жадный" - он будет искать строку максимальной длины, соответствующую условию в "Искать". Запрос <.*> в строке <p>что-то здесь</p> найдет всю строку целиком: <p>что-то здесь</p> Нежадный ("ленивый") поиск:

  • .+?
  • .*?
    -- ищет до первого вхождения символа, указанного после ?
  • <.*?> - найдет тег <p>, затем тег <p>: <p>что-то здесь</p>
  • ч.+о - найдет "что-то"
  • ч.+?о - найдет "что"

Найдите с помощью "ленивого поиска" последовательность букв от пробела до пробела (слово).

Экранирующий символ:

  • \. - ищет точку
  • \\ - ищет обратный слэш
  • \+, \*, \[, \], \( - ищет плюс, звездочку, знаки скобок и т.п.

Найдите все концы абзацев, заканчивающиеся на точку.

6. Ссылка на найденную строку (backreference) в поле для замены

Заключите все условие или его части в скобки.

В поле "Заменить"

  • \1, \2, \3 - обозначает части поиска, которые в строке поиска заключены в первую, вторую и третью пару скобок, соответственно
    Например, так можно пометить все слова, содержащие сочетание букв ов дважды в середине слова:
  • ([а-яё]+ов[а-яё]+ов[а-яё]{\1} - найденную последовательность символов (слово) заключаем в фигурные скобки.

Упражнение:
Поменяйте в файле первый и второй абзац местами.

Практикум

А. Поиск и замена. Файл для работы - dovlatov3.txt

  1. убрать ударения
  2. заменить прописные буквы строчными в заголовке
  3. заменить пробелы в начале абзацев на табуляцию
  4. убрать "жесткие" концы строк, оставив деление на абзацы и мини-рассказы
  5. при этом аккуратно обработать слова с переносами
  6. убрать "лишние" пробелы (два и больше)

Полезные приемы

Удаление знаков ударения:

  • Выделите символ ударения, меню Поиск → Замена,
  • поле Заменить оставьте пустым. (Режим поиска: обычный, Заменить всё)

Правка → Преобразовать выделение → строчные

Замена пробелов в начале строки на табуляцию:

  • Найти: ^˽˽˽˽˽ (5 пробелов) или ^˽+ (любое количество пробелов в начале строки)
  • Заменить: \t (Режим поиска: расширенный)

Замена границ мини-рассказов в тексте:

  • Найти: \r\n\r\n,
  • Заменить на псевдослово (например, #newdoc#). (Режим поиска: расширенный)

Замена концов строк на пробел:

  • Найти: \r\n
  • Заменить на 1 пробел. (Режим поиска: расширенный)

Верните границы абзацев и мини-рассказов. (Догадайтесь, как! Подсказка: абзацы начинаются с табуляции).

В. Работа с tsv и conllu. Файл для работы - tsv-файл из ELAN

  1. Откройте файл elan_livecorpus_template.tsv - результат импорта слоя токенов в текстовом формате с разделителями табуляции. В нем 4 столбца (имя слоя, время начала, время окончания, аннотация).

  2. Переведите его в формат conllu, состоящий из 10 столбцов, где токены должны оказаться во втором столбце, а остальные три столбца занять столбцы 8-10. Пустые поля в столбцах обозначим нижним подчеркиванием.

  • Подсказка: ^([^\n\t]+)\t([^\n\t]+) → \2\t\1 - так можно поменять столбцы местами.
  • Еще подсказка: в поле замены можно написать что-то вроде _\t\3\t_\t_\t_\t_\t_\t\2\t\1.
  1. Пронумеруйте строки от 1 до N в первом столбце.
  • Правка → Генератор столбца. Установите стартовый номер (1) и шаг нумерации (1).

Дополнительное задание 1:

Cоздайте список уникальных слов по вашему файлу.

  1. сохраните содержимое файла в новый файл dovlatov_wordlist.txt
  2. переведите все слова в нижний регистр (Правка -> Конвертировать Регистр / Edit -> Convert case to...)
  3. сделайте так, чтобы каждое слово шло с новой строки, вставив концы строк
  4. сделайте так, чтобы каждый знак препинания также шел с новой строки
  5. отсортируйте строки по алфавиту (Правка -> Операции со строками -> Сортировать по возрастанию / Edit -> Line operations -> Sort lines lexicographically ascending).
  6. удалите повторяющиеся строки с помощью регулярных выражений
    ^(.*\r\n)\1+\1

Дополнительное задание 2:

В файле с текстом разметьте начало и конец прямой речи с помощью тега , например, вот так:

   -- <speech>Не думаю</speech>, -- сказал редактор, потом вдруг
рассердился, -- <speech>хватит!  Вечные отговорки!  Всё не как
у людей!  Извольте одеваться так, как подобает
работнику солидной газеты!</speech>

Все ли реплики прямой речи вам удастся так разметить?

Дополнительное задание 3:

Из файла .eaf извлеките весь содержательный текст (реплики, токены и т.д.).

Файлы для работы:

  1. dovlatov3.utf8.txt и dovlatov3.txt
  2. tsv-файл из ELAN
  3. xml-файл из НКРЯ
  4. yaml-файл из Русского Конструктикона

Дополнительные материалы

  • Краткий курс по регулярным выражениям в NotePad++](http://markantoniou.blogspot.ru/2008/06/notepad-how-to-use-regular-expressions.html)

  • Особенности различных редакторов:

  • \d+{3,5} - арабские цифры повторяются от 3 до 5 раз (в NotePad++ нет)

  • \0 обозначает все условие поиска (не во всех редакторах доступно)

  • $1 вместо \1 и т.д. -- в редакторе Atom (подъязык регулярных выражений для Perl)

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