Учебная страница курса биоинформатики,
год поступления 2013
Форматирование выдачи.
Регулярные выражения
RE |
Synonyms |
Description |
Examples |
Van[yj]a |
|
В квадратных скобочках указываются символы, которые могут стоять в данной позиции. При этом можно использовать тире для того, чтобы указывать последовательность символов, например: [0-9] (все цифры), [a-z] все маленькие буквы, [a-zA-Z] (все буквы) |
+ Vanya |
Van[^ji] |
|
Если первым символом после открывающей квадратной скобочки является ^, то в квадратных скобочках перечисляются символы, которые НЕ могут стоять в данной позиции, т.е. остальные все символы, кроме этих, могут. |
+ Vanya |
Van{3}ya |
Vannnya |
В фигурных скобочках указывается количество раз, которое повторяется непосредственно предшествующий символ |
+ Vannnya |
Van{1,3}ya |
|
В фигурных скобочках через запятую указывается минимальное и максимальное количество раз, которое повторяется непосредственно предшествующий символ |
+ Vannnya |
Van{2,}ya |
|
Если максимальное количество раз пропущено, то это значит что количество повторений сверху не ограничено и может быть бесконечным |
+ Vannya |
Van?ya |
Van{0,1}ya |
Знак вопроса означает, что непосредственно предшествующий символ необязательный |
+ Vaya |
Van*ya |
Van{0,}ya |
Звездочка означает 0 или большее количество повторений непосредственно предшествующего символа |
+ Vaya |
Van+ya |
Van{1,}ya |
Плюсик означает 1 или большее количество повторений непосредственно предшествующего символа |
- Vaya |
Va.ya |
|
Точка означает любой символ, кроме символа конец строки (\n) |
+ Va.ya |
Va\.ya |
|
Backslash «защищает» символ, который следует за ним, т.е. делает символ обычным. |
+ Va.ya |
(Va)+nya |
|
Скобочки используются для группировки |
+ Vanya |
^Van |
|
^ обозначает начало строки |
+ Vanya |
ya$ |
|
$ обозначает конец строки |
+ Kolya |
Vanya|Kolya |
|
Выбор одного из нескольких вариантов |
+Vanya |
Van(ya|e) |
|
Выбор одного из нескольких вариантов и круглые скобки |
+Vanya |
\s |
[ \t\n\r\f] |
Space char – символ пробела |
|
\S |
[^ \t\n\r\f] |
! Space char – не символ пробела |
|
\d |
[0-9] |
Digit |
|
\D |
[^0-9] |
! Digit |
|
\w |
[a-zA-Z0-9] |
Word char – буква |
|
\W |
[^a-zA-Z0-9] |
! Word char – не буква |
|
\b |
|
Граница слова |
|
\B |
|
НЕ Граница слова |
|
Составьте регулярное выражение, которое бы подходило к:
- слову, длина которого ровно 10 букв
- предложению, состоящему ровно из 6 слов
- слову с заглавной буквы, но чтобы это слово было не первым словом в предложении
- Предложения, заканчивающиеся на ya
именам русских авторов в SwissProt
- имена авторов, которые начинаются на букву A
- последовательности, длина которых больше 1000
строки с http ссылками http://
Использование регулярных выражений
Теперь, когда мы рассмотрели несколько простых регулярных выражений, как мы можем использовать их в Python? Модуль re предоставляет интерфейс для регулярных выражений.
>>>import re
Выполнение сопоставлений
После того, как у вас есть объект, представляющий скомпилированное регулярное выражение, что вы с ним будете делать? Объекты шаблонов имеют несколько методов. Мы рассмотрим самые необходимые.
- match()
- Определить, начинается ли совпадение регулярного выражения с начала строки
- search()
- Сканировать всю строку в поисках первого совпадения с регулярным выражением
- findall()
- Найти все подстроки совпадений с регулярным выражением и вернуть их в виде списка
Если не было найдено ни одного совпадения, то match() и search() возвращают None. Если поиск успешен, возвращается обьект (MatchObject), содержащий информацию о совпадении: где оно начинается и заканчивается, подстрока соответствия, и так далее. Теперь вы можете попробовать сравнить строки для регулярного выражения [a-z]+. Пустая строка ему не будет соответствовать, потому что + означает повторение «один или больше» раз. match() в этом случае должен вернуть None, что и видим:
Теперь попробуем строку, которая должна совпасть с шаблоном: 'tempo'. В этом случае match() вернет MatchObject, который вы можете разместить в какой-то переменной, чтобы использовать ее в дальнейшем:
1 >>> m = re.match(r'[a-z]+', 'tempo')
Теперь вы можете вызывать MatchObject для получения информации о соответствующих строках. Для MatchObject также имеется несколько методов и атрибутов, наиболее важными из которых являются:
- group()
- Вернуть строку, сошедшуюся с регулярным выражением
- start()
- Вернуть позицию начала совпадения
- end()
- Вернуть позицию конца совпадения
- span()
- Вернуть кортеж (start, end) позиций совпадения
Так как метод match() проверяет совпадения только с начала строки, start() всегда будет возвращать 0. Однако метод search() сканирует всю строку, так что для него начало не обязательно в нуле:
В реальных программах наиболее распространенный стиль это хранение MatchObject в переменной, а затем проверка по None. Обычно это выглядит следующим образом:
Два метода возвращают все совпадения для шаблона. findall() возвращает список совпавших подстрок:
Метод findall() должен создать полный список, прежде чем он может быть возвращен в качестве результата.
Группы в регулярных выражениях
Когда мы ставим какую-нибудь часть регулярного выражения в скобки, питон запоминает ту часть входной строки, которую мы нашли этой парой скобок. Мы можем ей впоследствии пользоваться, ля этого нужно обращаться к ней по номеру скобок: скобки считаются по открывающей скобке начиная с 1. А способов пользоваться этим несколько:
Во-первых, когда мы получили match object из поиска регулярного выражения, мы можем получить строку, найденную парой скобок, с помощью методов group(), start() и end()
Во-вторых, мы можем в самом регулярном выражении требовать нахождения в выбранном месте того же текста, который мы уже один раз им же нашли группой. Такой приём называется back-reference, обратная ссылка. Для этого нужно в регулярном выражении использовать запись \1 \2 ... (\ и номер группы). Например:
Обратные ссылки ведут себя предсказуемым образом только в простейших случаях. В случае, если скобка стоит под каким-нибудь множителем (*, +, {} и т.п), в неё попадает только последняя из находок. Если в группу в регулярном выражении не попало текста, или она находится в не сработавшей ветке альтернативы, то питон в зависимости от случая либо запретит такой группой пользоваться, либо скажет, что она нашла пустую строку. Например:
Поиск с заменой
Мы можем попросить питон заменить часть ту строки, которую мы нашли регулярным выражением, на какой-нибудь текст. Для этого в модуле re есть функция sub. Она принимает три аргумента: что искать, на что заменять, где искать. Функция sub ищет выражение во всех местах строки (т.е. ведёт себя как search). Например:
Кроме того, мы можем в подставляемом выражении использовать обратные ссылки:
re.split
Ещё одна полезная возможность у регулярных выражений – они позволяют использовать регулярное выражение для разбиения строки на части:
Форматирование выдачи
Когда мы пишем программу, которая собирает какие-то данные, возникает потребность во-первых как-то перемежать выходные данные с пояснениями, во-вторых, при выводе чисел, форматировать их каким-нибудь специальным образом – с десятичной точкой или без, отводить под число какое-то число символов, писать его с нулями или пробелами вначале или с пробелами в конце и т.п. Каждую такую задачу можно решить самостоятельно, но это довольно частая потребность, а каждый раз решать одну и ту же задачу нудно и неинтересно. Поэтому в питоне для этого есть готовое средство: метод format у строк.
Работает он так: вы пишете строку с вашим текстом и описанием того, куда и как вставить в неё ваши данные (эта строка называется шаблоном), и вызываете для этой строки метод format, которой даёте вставляемые данные в качестве аргументов.
Место, куда нужно вставить ваши данные, обозначается в шаблоне знаком {0}.
Пример:
Описания бывают вида:
{0} .. {N} – вставить сюда аргумент номер N метода format
{0:5} – оставить под этот текст как минимум 5 символов – это полезно для табличной выдачи
{0:05.3f} – выводить как число с плавающей точкой в формате через точку, выводить суммарно не менее 5 символов, из них не менее 3 символов после точки, свободное пространство слева заполнять нулями
Примеры:
Кроме того, методу format можно передавать параметры по имени, и тогда по имени же к ним нужно будет и обращаться из шаблона. Это бывает очень удобно, особенно, если выводимый текст длинный или наоборот, пестрит пунктуацией:
Возможности указания форматов в этом месте очень велики и мы не будем всё охватывать в наших лекциях, но отошлём вас к документации.