Регулярные выражения
Этот план скопирован из LecturesVMSH/Python/2013-05-17, темы, которые на занятии (по упущению) не рассматривались, отмечены /!\.
- Использование регулярных выражений в задаче поиска шаблонов в последовательности строк
- Синтаксис РВ символы и спецсимволы
диапазоны: ".", "[…]" и "[^…]"
спецсимволы-диапазоны: "\s" (любой разделитель), "\d" (десятичная цифра), "\w" (цифра или буква) и т. п.
локаторы: "^" и "$"
повторители "*", "+", "?" и "{…}"
группа "(…)" и её использование с повторителями
ссылка на номер группы: "\1", "\2" и т. д.
альтернатива "|"
Модуль re:
findall(), split()
Поиск с заменой, использование ссылок; sub()
простейший пример РВ в Linux: grep и egrep
Домашнее задание
Прочитать про регулярные выражения на Википедии и в документации
Упражнения. В упражнениях мы будем использовать конструкцию re.search(шаблон, строка).group(), которая возвращает часть строки, соответствующую всему шаблону и re.search(шаблон, строка).groups(), которая возвращает части строки, соответствующие группам, если они есть в шаблоне. Про т. н. «match object», который возвращает функция re.search(), см. в документации.
- Простые РВ.
Найти подстроку вида "«любой символ»A": ".A"
>>> re.search(r'.A','qwAbnA').group() 'wA'
Найти подстроку вида "«цифра»/«цифра»": …
Найти подстроку вида "«маленькая латинская буква»«любой символ»" в конце строки: …
- С повторителями
Найти подстроку вида "(«пять каких-то символов»)": "\(.{5}\)" (использование "\(" превращает "(" из спецсимвола в обычную скобочку)
>>> re.search(r'\(.{5}\)','((((()))))').group() '((((())'
Найти подстроку вида "(«какие-то не-скобки»)": …
Найти подстроку вида "/«не менее одной буквы»/": …
Найти подстроку вида "«две-три буквы»«две-три цифры»": …
Какому шаблону соответствуют подстроки "ABC", "A-B-C", "AB+C", но не "A+=B-C", "ArCaB" и "AzBooC"?
- Альтернативы и повторители на них
Подстрока, состоящая из "K" и идущих парами "L": "(K|LL)+"
>>> re.search(r'(K|LL)+','qweKLLKKLLLLKLasd').group() 'KLLKKLLLLK'
Натуральное число: "\d+"
- Целое число: …
- Фраза "slow motion", в которой перед "motion" может стоять определённый или неопределённый артикль
- Целое число с учётом того, что "0" не бывает отрицательным
- Поиск с заменой
- Поменять местами первое и второе слово в строке:
>>> re.sub(r"([^\s]+)(\s+)([^\s]+)",r"\3\2\1","one tho three") 'tho one three' >>> re.sub(r"(\S+)(\s+)(\S+)",r"\3\2\1","one tho three") 'tho one three'
- заменить цифры точками: …
заменить парные кавычки строками "<<" и ">>": …
… + исключить из рассмотрения экранированные кавычки ('\"')
- Поменять местами первое и второе слово в строке:
- Написать программу, заменяющую в тексте двухбуквенные имена дней недели («Пн Вт Ср Чт Пт Сб Вс») на номера.
- Простые РВ.
Написать РВ, распознающее числа в формате с плавающей точкой (например, такие, в которые python преобразует -0.000000000123412 и 12300000000000000.):
-1.23412e-10 и 1.23e+16
Пока хватит, большие задачки будем делать в следующий раз Но если всё же интересно, см LecturesVMSH/2011-03-16
Условные обозначения
— тема по Linux
— тема повышенной сложности
— теоретическое задание
— тема для самостоятельного изучения