В этом практикуме мы будем работать со сменой кодировок файла и форматов конца строки, со скрытыми символами и режимом переноса строк. Вы познакомитесь с возможностями, которые предоставляют профессиональные текстовые редакторы в части поиска и замены, в том числе с использованием "регулярных выражений".
Что понадобится: NotePad++
Владельцы Mac-ов и компьютеров на Linux используют аналоги из списка.
(Обратите внимание: Обычный Блокнот (NotePad), Word и прочие офисные редакторы для этого практикума не годятся).
Типы кодировок текста для русского языка:
- Unicode (UTF-8 без цифровой подписи BOM и с нею) - основная кодировка для автоматической обработки текстовых файлов
- Cyrillic Windows (cp1251) - кодировка компании Microsoft для Windows
- KOI8-R, DOS, ... - более старые форматы
- ASCII (American Standard Code for Information Interchange) - предок всех вышеупомянутых
Упражнение
- Откройте файл dovlatov3.utf8.txt.
В меню "Кодировки" замените текущую на Windows-1251, затем обратно на UTF-8 без BOM.
Если вы открываете файл и видите "кракозябры", то с помощью меню "Кодировки" можно подобрать правильную.
"Преобразовать в...": переводит файл в другую кодировку (затем файл нужно сохранить). Windows-1251 называется ANSI.
"Открыть в другой кодировке" и "преобразовать в кодировку" - разные команды (подумайте, почему).
Mac/BBedit: настроить кодировку: меню Файл/File - Перезагрузить с помощью кодировки...
Кодировка файла меняется с помощью меню Файл - Сохранить как... - Encoding
В меню Отображение символов
отметьте чекбоксы: (а) отображать пробелы и табуляции, (b) отображать символы конца строки ((c) отображать все символы).
Перенос строк
(text wrap
) автоматически переносит текст на новую строку, как в Word. Видимые концы строк при этом не сохраняются (являются "мягкими", то есть вычисляются редактором по специальному алгоритму).
Mac/BBedit: меню Вид/View - Text Display - Show Invisibles
Непечатаемые символы, обозначающие конец строки:
- формат Windows: CR+LF
\r\n
- формат Mac (старый): CR
\r
- формат UNIX: LF
\n
В режиме отображения символов конца строки вы увидите "СR", "LF", которые при поиске и замене в расширенном режиме и в режиме регулярных выражений задаются как эскейп-символы \r
, \n
, соответственно.
Mac/BBedit: формат конца строки меняется с помощью меню Файл - Сохранить как... - Конец строки
Меню для поиска и замены доступно по горячей клавише Ctrl+F
(см. также меню Поиск и замена или Правка, в зависимости от редактора)
Отмена операции: Ctrl+Z
По умолчанию, в NotePad++ поиск происводится начиная с текущей позиции курсора до конца файла, включите чекбокс "Зациклить поиск", чтобы замена проводилась по всему файлу.
Поиск у учетом регистра и без: прописные и строчные буквы будут различаться (орел и Орел).
Mac/BBedit: поиск Command+F или меню Поиск/Search. Отмена операции: Command+Z.
Зациклить поиск: Wrap around. Поиск с учетом регистра: Case sensitive
Упражнение
- Найдите все вхождения отрицания не.
- Замените их на НЕ.
- Отмените последнюю операцию.
-
Специальные символы: экскейп-символ
\t
(табуляция),\n
,\r\n
(символы конца строки, см. выше). -
^
- начало строки,$
- конец строки -
к[аоиу]т
- найдет кат, кот, кит, кут -
[а-яё]
- найдет все буквы русского алфавита -
[0-9a-z@_.]
- все знаки, допустимые в адресе электронной почты
Узнайте, есть ли в тексте латинские буквы?
-
[^а-я]
- "крышка" обозначает НЕ, т. е. все символы, кроме указанного диапазона а-я -
[^!]$
- найдет концы абзацев, не заканчивающиеся на восклицательный знак -
е+
- найдет е, ее, еее... -
[нм]+
- найдет сочетания нн, мм, нм, мн, ммм, нннн, мнннннм... -
.
- любой символ -
.+
- повтор (любого символа) 1 или более раз -
.*
- повтор (любого символа) 0 или более раз -
л.+
- найдет букву л и далее все символы до конца строки -
л[а-яё]+
- что найдется здесь? -
˽я[а-яё]*
- (в начале пробел) найдет слова, начинающиеся с я, в том числе слово я
Этот поиск "жадный" - он будет искать строку максимальной длины, соответствующую условию в "Искать".
Запрос <.*>
в строке <p>что-то здесь</p>
найдет всю строку целиком: <p>что-то здесь</p>
Нежадный ("ленивый") поиск:
.+?
.*?
-- ищет до первого вхождения символа, указанного после ?<.*?>
- найдет тег<p>
, затем тег<p>
:<p>что-то здесь</p>
ч.+о
- найдет"что-то"
ч.+?о
- найдет"что"
Найдите с помощью "ленивого поиска" последовательность букв от пробела до пробела (слово).
Экранирующий символ:
\.
- ищет точку\\
- ищет обратный слэш\+
,\*
,\[
,\]
,\(
- ищет плюс, звездочку, знаки скобок и т.п.
Найдите все концы абзацев, заканчивающиеся на точку.
Заключите все условие или его части в скобки.
В поле "Заменить"
\1
,\2
,\3
- обозначает части поиска, которые в строке поиска заключены в первую, вторую и третью пару скобок, соответственно
Например, так можно пометить все слова, содержащие сочетание букв ов дважды в середине слова:([а-яё]+ов[а-яё]+ов[а-яё]
→{\1}
- найденную последовательность символов (слово) заключаем в фигурные скобки.
Упражнение:
Поменяйте в файле первый и второй абзац местами.
А. Поиск и замена. Файл для работы - dovlatov3.txt
- убрать ударения
- заменить прописные буквы строчными в заголовке
- заменить пробелы в начале абзацев на табуляцию
- убрать "жесткие" концы строк, оставив деление на абзацы и мини-рассказы
- при этом аккуратно обработать слова с переносами
- убрать "лишние" пробелы (два и больше)
Полезные приемы
Удаление знаков ударения:
- Выделите символ ударения, меню Поиск → Замена,
- поле Заменить оставьте пустым. (Режим поиска: обычный, Заменить всё)
Правка → Преобразовать выделение → строчные
Замена пробелов в начале строки на табуляцию:
- Найти:
^˽˽˽˽˽
(5 пробелов) или^˽+
(любое количество пробелов в начале строки) - Заменить:
\t
(Режим поиска: расширенный)
Замена границ мини-рассказов в тексте:
- Найти:
\r\n\r\n
, - Заменить на псевдослово (например, #newdoc#). (Режим поиска: расширенный)
Замена концов строк на пробел:
- Найти:
\r\n
- Заменить на 1 пробел. (Режим поиска: расширенный)
Верните границы абзацев и мини-рассказов. (Догадайтесь, как! Подсказка: абзацы начинаются с табуляции).
В. Работа с tsv и conllu. Файл для работы - tsv-файл из ELAN
-
Откройте файл
elan_livecorpus_template.tsv
- результат импорта слоя токенов в текстовом формате с разделителями табуляции. В нем 4 столбца (имя слоя, время начала, время окончания, аннотация). -
Переведите его в формат conllu, состоящий из 10 столбцов, где токены должны оказаться во втором столбце, а остальные три столбца занять столбцы 8-10. Пустые поля в столбцах обозначим нижним подчеркиванием.
- Подсказка:
^([^\n\t]+)\t([^\n\t]+) → \2\t\1
- так можно поменять столбцы местами. - Еще подсказка: в поле замены можно написать что-то вроде
_\t\3\t_\t_\t_\t_\t_\t\2\t\1
.
- Пронумеруйте строки от 1 до N в первом столбце.
- Правка → Генератор столбца. Установите стартовый номер (1) и шаг нумерации (1).
Cоздайте список уникальных слов по вашему файлу.
- сохраните содержимое файла в новый файл dovlatov_wordlist.txt
- переведите все слова в нижний регистр (Правка -> Конвертировать Регистр / Edit -> Convert case to...)
- сделайте так, чтобы каждое слово шло с новой строки, вставив концы строк
- сделайте так, чтобы каждый знак препинания также шел с новой строки
- отсортируйте строки по алфавиту (Правка -> Операции со строками -> Сортировать по возрастанию / Edit -> Line operations -> Sort lines lexicographically ascending).
- удалите повторяющиеся строки с помощью регулярных выражений
^(.*\r\n)\1+
→\1
В файле с текстом разметьте начало и конец прямой речи с помощью тега , например, вот так:
-- <speech>Не думаю</speech>, -- сказал редактор, потом вдруг
рассердился, -- <speech>хватит! Вечные отговорки! Всё не как
у людей! Извольте одеваться так, как подобает
работнику солидной газеты!</speech>
Все ли реплики прямой речи вам удастся так разметить?
Из файла .eaf извлеките весь содержательный текст (реплики, токены и т.д.).
- dovlatov3.utf8.txt и dovlatov3.txt
- tsv-файл из ELAN
- xml-файл из НКРЯ
- 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)
Язык регулярных выражений может немного различаться в разных редакторах и в разных языках программирования, но в целом набор приемов и принципы поиска одинаковы.