Регулярные выражения
- Использование регулярных выражений в задаче поиска шаблонов в последовательности строк
- Синтаксис РВ символы и спецсимволы
диапазоны: ".", "[?]" и "[^?]"
спецсимволы-диапазоны: "\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
?? тема повышенной сложности
? теоретическое задание
? тема для самостоятельного изучения