Регулярные выражения
Это копипаста аналогичного материала прошлых лет; возможно, её надо отредактировать
неплохая методичка, в которой есть практически всё про РВ, о чём говорилось в лекции. Серьёзно, прямо план лекции.
Копия плана (примеры и пояснения см. на сайте):
- Что такое РВ?
- Спецсимволы
- Точка
- Набор символов (диапазон)
- Отрицание набора символов
- Повторения
- Звёздочка
- Плюс
- Знак вопроса
- Фигурные скобки
3.11+ {m,n}+ TODO попробовать
- Скобочные группы (карманы)
- Альтернация
- Экранирование
- Позиционные маркеры
- Каретка
- Доллар
- Дополнительные диапазоны и позиционные маркеры
- Контекстные проверки
- Предпросмотр, негативный предпросмотр
- Пост-просмотр, негативный пост-просмотр
3.11+ (?>...) TODO попробовать
- Флаги
- Поиск без учета регистра
- Многостроковый поиск
Перевод строки как любой символ
- Жадные vs ленивые повторители
3.11+ алчные повторители: *+, ++ и ?+
Особенности 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: CorrectNumber 'Проверка числа'
Дано число. Требуется определить, корректно ли оно. Число может быть записано в двух формах: обычной и экспоненциальной:
- Число в обычной форме не должно содержать ведущих нулей. Знак "-" должен стоять только перед непололожительным числом и только в одном экземпляре. Число также может быть записано в двоичной, восьмеричной или шестнадцатеричной системе счисления. В различных системах счисления число будет иметь вид (угловые скобки означают термин):
- %0x<обычная форма>
- в шестнадцатеричной (состоит из цифр и маленьких латинских букв). Число знаков после "0x" не должно превышать 16.
- %0o<обычная форма>
- в восьмеричной. Число знаков после "0o" не должно превышать 8.
- %0b<обычная форма>
- в двоичной. Число знаков после "0b" не должно превышать 20.
Знак "-" также может быть только один и должен стоять перед символом "%". Примеры корректных чисел в обычной форме: 75, -%0x6f4, %0b101110 , %0o1705.
- Число в экспоненциальной форме представляет собой запись следующего вида (необязательные элементы заключены в квадратные скобки):
<число в обычной форме>[<.><неотрицательное число в обычной форме, может содержать ведущие нули, не влияющие на подсчет количества знаков и стоящие до символа "%" если число не в десятичной системе счисления>]<E>[<знак "+" или "-"><число в обычной форме>]
%0x5f7.00%0b1011E-%0o71
YES
- Число в обычной форме не должно содержать ведущих нулей. Знак "-" должен стоять только перед непололожительным числом и только в одном экземпляре. Число также может быть записано в двоичной, восьмеричной или шестнадцатеричной системе счисления. В различных системах счисления число будет иметь вид (угловые скобки означают термин):