Регулярные выражения
неплохая методичка, в которой есть практически всё про РВ, о чём говорилось в лекции. Серьёзно, прямо план лекции.
Копия плана (примеры и пояснения см. на сайте):
Что такое регулярные выражения?
- Спецсимволы
- Точка
- Набор символов (диапазон)
- Отрицание набора символов
- Повторения
- Звёздочка
- Плюс
- Знак вопроса
- Фигурные скобки
- Скобочные группы (карманы)
- Альтернация
- Экранирование
- Позиционные маркеры
- Каретка
- Доллар
- Дополнительные диапазоны и позиционные маркеры
- Контекстные проверки
- Предпросмотр, негативный предпросмотр
- Пост-просмотр, негативный пост-просмотр
- Флаги
- Поиск без учета регистра
- Многостроковый поиск
Перевод строки как любой символ
Ленивые повторители: *?, +?, ??, {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 'Структура РВ'
Написать программу, которой на вход подаётся синтаксически верное регулярное выражение, а затем — строки поиска (последняя строка пустая). Программа должна выводить информацию о первой найденной в строке поиска подстроке, соответствующей регулярному выражению, в таком формате:
Если подстрока не найдена, выводится «<NONE>»
Если подстрока найдена, выводится позиция: подстрока, где «позиция» — это номер символа в строке, начиная с которого была найдена подстрока
Если в регулярном выражении присутствовала группировка с сохранением (попросту скобочки), выводится номер группы/позиция: подстрока для каждой группы
Если в регулярном выражении присутствовали именованные группы, выводится имя группы/позиция: подстрока для каждой группы (в порядке их появления в re.Match.groupdict())
Если какая-то группа присутствует в исходном выражении, но не нашла сопоставления (например, была помечена повторителем * и пропущена), она не выводится
(\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 'Интервалы'
Скобочные конструкции, в которых нет вложенности (или она фиксировано очень неглубокая) можно разбирать регулярными выражениями. Написать генератор-функцию interval(diap), которой передаётся строка diap следующего формата:
- В начале и конце строки стоит по одной круглой или квадратной скобке
- В скобках указаны два числа, разделённые описателем интервала
Число — либо целое, либо вещественное с фиксированной точкой и обязательными целой и дробной частями
- вокруг числа (и для простоты — после необязательного минуса тоже) могут стоять пробелы
Описатель интервала — либо (1) две и более точки, либо (2) конструкция вида «..длина..», где длина — это целое число ⩾2
interval(diap) должна возвращать последовательность чисел типа Fraction от левого числа до правого.
Длина этой последовательности — это либо количество точек в варианте (1), либо значение длины в варианте (2)
- Круглая скобка вместо квадратной исключает из последовательности соответствующий элемент (начало или конец) и делает её на один элемент короче.
- Все элементы последовательности должны быть равноудалены друг от друга.
Если diap не соответствует формату, последовательность пустая.
1 print(*interval("[1.....10.5)"))
1 27/8 23/4 65/8
EJudge: CorrectNumber 'Проверка числа'
Ввести строку, представляющую собой «число». Требуется определить, корректно ли оно. Число может быть записано в двух формах: обычной и экспоненциальной:
- Число в обычной форме не должно содержать ведущих нулей. Знак "-" должен стоять только перед непололожительным числом и только в одном экземпляре. Число также может быть записано в двоичной, восьмеричной или шестнадцатеричной системе счисления. В различных системах счисления число будет иметь вид (угловые скобки означают термин):
- %0x<обычная форма>
- в шестнадцатеричной (состоит из цифр и маленьких латинских букв). Число знаков после "0x" не должно превышать 16.
- %0o<обычная форма>
- в восьмеричной. Число знаков после "0o" не должно превышать 8.
- %0b<обычная форма>
- в двоичной. Число знаков после "0b" не должно превышать 20.
Знак "-" также может быть только один и должен стоять перед символом "%". Примеры корректных чисел в обычной форме: 75, -%0x6f4, %0b101110 , %0o1705.
- Число в экспоненциальной форме представляет собой запись следующего вида (необязательные элементы заключены в квадратные скобки):
<число в обычной форме>[<.><неотрицательное число в обычной форме, может содержать ведущие нули, не влияющие на подсчет количества знаков и стоящие до символа "%" если число не в десятичной системе счисления>]<E>[<знак "+" или "-"><неотрицательное число в обычной форме>]
В зависимости от корректности вывести "YES" или "NO"
%0x5f7.00%0b1011E-%0o71
YES
- Число в обычной форме не должно содержать ведущих нулей. Знак "-" должен стоять только перед непололожительным числом и только в одном экземпляре. Число также может быть записано в двоичной, восьмеричной или шестнадцатеричной системе счисления. В различных системах счисления число будет иметь вид (угловые скобки означают термин):