Регулярные выражения
неплохая методичка, в которой есть практически всё про РВ, о чём говорилось в лекции. Серьёзно, прямо план лекции.
Копия плана (примеры и пояснения см. на сайте):
- Что такое РВ?
- Спецсимволы
- Точка
- Набор символов (диапазон)
- Отрицание набора символов
- Повторения
- Звёздочка
- Плюс
- Знак вопроса
- Фигурные скобки
- Скобочные группы (карманы)
- Альтернация
- Экранирование
- Позиционные маркеры
- Каретка
- Доллар
- Дополнительные диапазоны и позиционные маркеры
- Контекстные проверки
- Предпросмотр, негативный предпросмотр
- Пост-просмотр, негативный пост-просмотр
- Флаги
- Поиск без учета регистра
- Многостроковый поиск
Перевод строки как любой символ
- Жадные vs ленивые повторители
Особенности Python
Работа функций match() и search()
Результат — последовательность Match Object-ов
Удобные инструменты: findall() / finditer(); esacpe(), split()
Поиск с заменой
В методичке нет про поиск с заменой sub()
Самоцитаты (back references) — \номер скобочной группы (номер открывающей скобки в целом RE)
Пример: (\w+).*(\1) на текст Matches between zero and unlimited times, as match times
Использование цитат в sub():
sub(r"(\w+).(\w+)", r"\2 — \1 — \1", "---qwerty---")
Ещё почитать
Д/З
- Прочитать и прощёлкать
методичку по regexp-ам
В частности, Match Objects
EJudge: RegexDump 'Структура РВ'
Написать программу, которой на вход подаётся синтаксически верное регулярное выражение, а затем — строки поиска (последняя строка пустая). Программа должна выводить информацию о первой найденной в строке поиска подстроке, соответствующей регулярному выражению, в таком формате:
Если подстрока не найдена, выводится «<NONE>»
Если подстрока найдена, выводится позиция: подстрока, где «позиция» — это номер символа в строке, начиная с которого была найдена подстрока
Если в регулярном выражении присутствовала группировка с сохранением (попросту скобочки), выводится номер группы/позиция: подстрока для каждой группы
Если в регулярном выражении присутствовали именованные группы, выводится имя группы/позиция: подстрока для каждой группы (в порядке их появления в re.Match.groupdict())
Если какая-то группа присутствует в исходном выражении, но не нашла сопоставления (например, была помечена повторителем * и пропущена), она не выводится
(\w)+(@+)?(?P<nonalpha>\W+)--(\w+) ^_^awww-----foo;_; #$qwer@@@--wqer#$
3: awww-----foo 1/6: w 3/7: --- 4/12: foo nonalpha/7: --- 2: qwer@@@--wqer 1/5: r 2/6: @@ 3/8: @ 4/11: wqer nonalpha/8: @
EJudge: PigLatin 'Поросячья латынь'
Согласно правилам «поросячьей латыни» английские слова при разговоре преобразуются так:
Если слово начинается на согласную — эта согласная переносится в конец слова, после чего добавляется «ay»: "latin" ⇒ "atinlay"
Если слово начинается на несколько согласных, они все переносятся в конец слова, после чего добавляется «ay»: "stupid" ⇒ "upidstay"
Если слово начинается на гласную, "aouie" (не "y"!), cодержит согласные и имеет более одного слога, лидирующие гласные и все согласные за ними переносятся в конец с добавлением «ay»: "under" ⇒ "erunday" (в Википедии это второй вариант)
для нашего удобства непроизносимые гласные тоже считаются слогом, например "are" ⇒ "earay"; (так исторически не было: язык всё-таки разговорный)
Односложные слова, начинающиеся на гласную, а также слова, состоящие из одних только гласных, просто дополняются «yay»: "egg" ⇒ "eggyay"
Последовательности, состоящие только из согласных, не изменяются (например, такой последовательностью является «my»)
Апостроф считается согласной буквой (маленькой), а дефис — разделителем (опять-таки для простоты)
Написать программу, которая построчно вводит «английский» текст (текст, содержащий последовательности латинских букв и другие символы; последняя строка пустая) и выводит перевод на поросячью латынь (для простоты любая последовательность английских букв с гласными считается словом). Обратите внимание на то, что слово, написанное со заглавной буквы, в поросячьей латыни также пишется со заглавной буквы. Более одной заглавной буквы в слове не встречается.
This is an example of Hog Latin. As you can see, it's silly, but lots of fun for children.
Isthay isyay anyay ampleexay ofyay Oghay Atinlay. Asyay ouyay ancay eesay, it'syay illysay, utbay otslay ofyay unfay orfay ildrenchay.
EJudge: ChicagoTurabian 'Чикаго Турабьян'
Написать программу, которой на вход подаётся две строки — внутритекстовая ссылка N на некоторую книгу и библиографическая ссылка B на эту же книгу. программа должна проверить, что обе ссылки синтаксически верны и ссылаются на одну и ту же книгу. Формат ссылок — упрощённый стиль Турабьян. Вывод программы — True, если B соответствует N, и False — если не соответствует, или такое соответствие невозможно определить из-за синтаксической некорректности
Полное описание стиля для задачи с примерами
Обратите внимание на то, как в B слились точка после инициала автора и точка после списка авторов.
- Будем считать, что страница может быть указана или одна, или диапазоном
Во всех примерах со страницами «–» — это не «—» и не «-». Серьёзно! А в интернете бывает все три.
- Будем считать, что у первого автора всегда есть и имя, и фамилия
- Никаких вложенных скобок!
Обратите внимание на т. н. «оксфордскую запятую» перед словом «and» в перечне авторов: она не соблюдается только для двух авторов в N, а в остальных случаях — для трёх и более авторов в N и для двух и более авторов в B — соблюдается)
42. Roger Frey, Utility and Rights (Minneapolis: University of Minnesota Press, 1984), 95. Frey, Roger. Utility and Rights. Minneapolis: University of Minnesota Press, 1984.
True
Это довольно кропотливая задача из реальной жизни с «некрасивым» решением