Регулярные выражения очень широко применяются при обработке строк для сравнения шаблонов. Язык Python, разумеется, имеет встроенную поддержку для работы с ними. Чтобы воспользоваться этими возможностями, необходимо импортировать модуль re
.
import re
Теперь все готово для использования регулярных выражений.
Метод re.search()
Метод re.search()
используется для нахождения первого вхождения заданного шаблона в строку.
Синтаксис: re.search(pattern, string, flags[optional])
Метод re.search()
принимает на вход шаблон и строку и возвращает объект match
в случае успеха, а в противном случае, если шаблон не был найден, возвращает None
. Объект match
имеет метод group()
, который возвращает сам шаблон.
import re s = "my number is 123" match = re.search(r'\d\d\d', s) match <_sre.SRE_Match object; span=(13, 16), match='123'> match.group() '123'
В примере выше мы использовали шаблон \d\d\d
. Шаблон \d
в регулярных выражениях сравнивает единичные цифры, следовательно \d\d\d
будет сравнивать цифры вида 111
, 222
, 786
. Соответственно, цифры вида 12
, 1444
будут пропущены.
Основные шаблоны регулярных выражений
Символ | Описание |
. | любой символ, за исключением новой строки |
\w |
любой буквенный, цифровой символ, а также нижнее подчеркивание |
\W |
любые не буквенные и не цифровые символы и не нижнее подчеркивание |
\d |
любая одиночная цифра |
\D |
любой одиночный символ, кроме цифры |
\s |
любой пробельный символ, как например \n , \t , а также сам пробел |
\S |
любой не пробельный одиночный символ |
[abc] |
любой одиночный символ в данном множестве, то есть в этом примере это либо a , либо b, либо c |
[^abc] |
любой одиночный символ, отличный от a , b и c |
[a-z] |
любой одиночный символ в диапазоне от a до z |
[a-zA-Z] |
любой одиночный символ в диапазоне a-z или A-Z |
[0-9] |
любой одиночный символ в диапазоне 0 —9 |
^ |
сравнение начинается с начала строки |
$ |
сравнение начинается с конца строки |
+ |
один или больше символов (жадное соответствие). |
* |
ноль или больше символов (жадное соответствие). |
Рассмотрим еще один пример.
import re s = "tim email is tim@somehost.com" match = re.search(r'[\w.-]+@[\w.-]+', s) # Приведенное выше регулярное выражение будет искать e-mail адрес if match: print(match.group()) else: print("сравнений не обнаружено")
Ожидаемый результат
tim@somehost.com
Здесь мы использовали шаблон [\w.-]+@[\w.-]+
чтобы найти в строке соответствие с e-mail адресом. В случае успеха метод re.search()
возвращает объект match
, а уже при помощи метода этого объекта group()
можно извлечь хранящийся там текст. В данном примере это tim@somehost.com.
Группровка выражений
Группировка выражений позволяет нам извлекать части из нужной строки. Создать группу можно при помощи круглых скобок ()
. Допустим, мы хотим извлечь отдельно имя пользователя и имя хоста из e-mail адреса, такого как в предыдущем примере. Для этого нам нужно заключить в разные скобки шаблон для имени и шаблон для хоста следующим образом:
match = re.search(r'([\w.-]+)@([\w.-]+)', s)
Обратите внимание: добавление скобок не означает изменение шаблона для поиска соответствия. Наш код по-прежнему ищет полное совпадение с заданным шаблоном. Если поиск увенчается успехом, match.group(1)
будет соответствовать содержимому первых круглых скобок, а match.group(2)
— содержимому вторых круглых скобок.
import re s = "tim email is tim@somehost.com" match = re.search('([\w.-]+)@([\w.-]+)', s) if match: print(match.group()) ## tim@somehost.com (полное сравнение) print(match.group(1)) ## tim (the username, первая группа) print(match.group(2)) ## somehost (the host, вторая группа)
Функция findall()
Как вы уже знаете, функция re.search()
находит только первое вхождение заданного шаблона в строку. А если мы хотим найти все вхождения, в дело вступает функция findall()
.
Синтаксис: findall(pattern, string, flags=0[optional])
В случае успеха данная функция возвращает список, в котором в виде строк содержатся все искомые вхождения по порядку. Если вхождений нет, то эта функция возвратит пустой список.
import re s = "Tim's phone numbers are 12345-41521 and 78963-85214" match = re.findall(r'\d{5}', s) if match: print(match)
Ожидаемый результат:
['12345', '41521', '78963', '85214']
Функция findall()
также позволяет использовать группировку выражений. Когда заданы скобочные группы, функция findall()
возвращает список кортежей, в которых содержатся искомые соответствия. Следующий пример должен все окончательно прояснить.
import re s = "Tim's phone numbers are 12345-41521 and 78963-85214" match = re.findall(r'(\d{5})-(\d{5})', s) print(match) for i in match: print() print(i) print("Первая группа", i[0]) print("Вторая группа", i[1])
Ожидаемый результат:
[('12345', '41521'), ('78963', '85214')] ('12345', '41521') Первая группа 12345 Вторая группа 41521 ('78963', '85214') Первая группа 78963 Вторая группа 85214
Опциональные флаги
Обе функции, re.search()
и re.findall()
, могут принимать необязательные параметры — флаги. С их помощью можно слегка изменять поведение функции.
Флаги | Описание |
---|---|
re.IGNORECASE |
При поиске соответствий будет игнорироваться регистр символов. |
re.DOTALL |
Позволяет (. ) искать символ новой строки. По умолчанию (. ) ищет любой символ кроме символа новой строки. |
re.MULTILINE |
Благодаря этому флагу ^ и $ будут означать начало и конец каждой строчки (line) в многострочной строке (string). По умолчанию эти символы означают начало и конец строки (string). |
Использование функции re.match()
Функция re.match()
очень похожа на функцию re.search()
. Различие состоит лишь в том, что функция re.match()
начинает поиск сравнений с начала строки.
import re s = "python tuts" match = re.match(r'py', s) match_1 = re.match(r'th', s) if match: print(match.group()) # выведет на экран 'py' if match_1: print(match_1.group()) # не выведет на экран ничего
Того же можно достичь и с функцией re.search()
, просто добавив ^
к шаблону сравнения.
import re s = "python tuts" match = re.search(r'^py', s) match_1 = re.search(r'^th', s) if match: print(match.group()) # выведет на экран 'py' if match_1: print(match_1.group()) # не выведет на экран ничего
На этом мы завершаем знакомство с модулем re
языка Python
.