Регулярные выражения
- неплохая методичка, в которой есть практически всё про РВ, о чём говорилось в лекции. Серьёзно, прямо план лекции. 
Копия плана (примеры и пояснения см. на сайте):
- Что такое регулярные выражения? 
- Спецсимволы - Точка
- Набор символов (диапазон) - Отрицание набора символов
 
- Повторения - Звёздочка
- Плюс
- Знак вопроса
 
- Фигурные скобки
- Скобочные группы (карманы)
- Альтернация
- Экранирование
- Позиционные маркеры - Каретка
- Доллар
 
 
- Дополнительные диапазоны и позиционные маркеры
- Контекстные проверки - Предпросмотр, негативный предпросмотр
- Пост-просмотр, негативный пост-просмотр
 
- Флаги - Поиск без учета регистра
- Многостроковый поиск - Перевод строки как любой символ 
 
 
- Ленивые повторители: *?, +?, ??, {m, n}? 
Сверх плана, 3.11+:
- алчные повторители: *+, ++, ?+ и {m,n}+ 
- (?>…) — общая конструкция алчной группировки 
Особенности 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 'Структура РВ' Input:- Написать программу, которой на вход подаётся синтаксически верное регулярное выражение, а затем — строки поиска (последняя строка пустая). Программа должна выводить информацию о первой найденной в строке поиска подстроке, соответствующей регулярному выражению, в таком формате: - Если подстрока не найдена, выводится «<NONE>» 
- Если подстрока найдена, выводится позиция: подстрока, где «позиция» — это номер символа в строке, начиная с которого была найдена подстрока 
- Если в регулярном выражении присутствовала группировка с сохранением (попросту скобочки), выводится номер группы/позиция: подстрока для каждой группы 
- Если в регулярном выражении присутствовали именованные группы, выводится имя группы/позиция: подстрока для каждой группы (в порядке их появления в re.Match.groupdict()) 
- Если какая-то группа присутствует в исходном выражении, но не нашла сопоставления (например, была помечена повторителем * и пропущена), она не выводится 
 Output:- (\w)+(@+)?(?P<nonalpha>\W+)--(\w+) ^_^awww-----foo;_; L'amor che muove il sole e l'altre stelle #$qwer@@@--wqer#$ - 3: awww-----foo 1/6: w 3/7: --- 4/12: foo nonalpha/7: --- <NONE> 2: qwer@@@--wqer 1/5: r 2/6: @@ 3/8: @ 4/11: wqer nonalpha/8: @ 
- EJudge: BraceDecode 'Интервалы' Input:- Скобочные конструкции, в которых нет вложенности (или она фиксировано очень неглубокая) можно разбирать регулярными выражениями. Написать генератор-функцию interval(diap), которой передаётся строка diap следующего формата: - В начале и конце строки стоит по одной круглой или квадратной скобке
- В скобках указаны два числа, разделённые описателем интервала
- Число — либо целое, либо вещественное с фиксированной точкой и обязательными целой и дробной частями - вокруг числа (и для простоты — после необязательного минуса тоже) могут стоять пробелы
 
- Описатель интервала — либо (1) две и более точки, либо (2) конструкция вида «..длина..», где длина — это целое число ⩾2 
 - interval(diap) должна возвращать последовательность чисел типа Fraction от левого числа до правого. - Длина этой последовательности — это либо количество точек в варианте (1), либо значение длины в варианте (2) 
- Круглая скобка вместо квадратной исключает из последовательности соответствующий элемент (начало или конец) и делает её на один элемент короче.
- Все элементы последовательности должны быть равноудалены друг от друга.
- Если diap не соответствует формату, последовательность пустая. 
 Output:- 1 print(*interval("[1.....10.5)"))- 1 27/8 23/4 65/8 
- EJudge: CorrectNumber 'Проверка числа' Input:- Ввести строку, представляющую собой «число». Требуется определить, корректно ли оно. Число может быть записано в двух формах: обычной и экспоненциальной: - Число в обычной форме не должно содержать ведущих нулей. Знак "-" должен стоять только перед непололожительным числом и только в одном экземпляре. Число также может быть записано в двоичной, восьмеричной или шестнадцатеричной системе счисления. В различных системах счисления число будет иметь вид (угловые скобки означают термин): - %0x<обычная форма>
- в шестнадцатеричной (состоит из цифр и маленьких латинских букв). Число знаков после "0x" не должно превышать 16.
- %0o<обычная форма>
- в восьмеричной. Число знаков после "0o" не должно превышать 8.
- %0b<обычная форма>
- в двоичной. Число знаков после "0b" не должно превышать 20.
 
- Знак "-" также может быть только один и должен стоять перед символом "%". Примеры корректных чисел в обычной форме: 75, -%0x6f4, %0b101110 , %0o1705. 
- Число в экспоненциальной форме представляет собой запись следующего вида (необязательные элементы заключены в квадратные скобки): <число в обычной форме>[<.><неотрицательное число в обычной форме, может содержать ведущие нули, не влияющие на подсчет количества знаков и стоящие до символа "%" если число не в десятичной системе счисления>]<E>[<знак "+" или "-"><неотрицательное число в обычной форме>] 
 - В зависимости от корректности вывести "YES" или "NO" Output:- %0x5f7.00%0b1011E-%0o71 - YES 
- Число в обычной форме не должно содержать ведущих нулей. Знак "-" должен стоять только перед непололожительным числом и только в одном экземпляре. Число также может быть записано в двоичной, восьмеричной или шестнадцатеричной системе счисления. В различных системах счисления число будет иметь вид (угловые скобки означают термин): 
