В языке Python существует мощное средство для поиска и замены текста при помощи шаблонов — так называемые регулярные выражения. Для их использования необходимо импортировать модуль re.

Давайте посмотрим на методы, которые предоставляет библиотека re. Вот наиболее часто используемые из них:

  • re.match()
  • re.search()
  • re.findall()
  • re.split()
  • re.sub()

re.match(pattern, string):

Этот метод ищет по заданному шаблону в начале строки.

import re
result = re.match('один', 'один в квадрате будет один')
print (result.group()) #один

Для вывода найденной строки используется group().

Теперь попробуем найти «будет» в данной строке. Поскольку строка начинается с «один», метод вернет None:

import re
result = re.match('будет', 'один в квадрате будет один')
print (result) #None

Также есть методы start() и end() для того, чтобы узнать начальную и конечную позицию найденной строки.

import re
result = re.match('один', 'один в квадрате будет один')
print (result.start()) #0
print (result.end()) #4

re.search(pattern, string):

Этот метод похож на match(), но он ищет не только в начале строки. И теперь мы можем найти слово “будет” в середине строки, которое мы не могли найти с помощью match():

import re
result = re.search('будет', 'один в квадрате будет один')
print (result.group()) #будет
print (result.start()) #16
print (result.end()) #21

re.findall(pattern, string):

Этот метод возвращает список всех найденных совпадений. У метода findall() нет ограничений на поиск в начале или конце строки.

import re
result = re.findall('один', 'один в квадрате будет один')
print (result) #['один', 'один']

re.split(pattern, string, [maxsplit=0]):

Этот метод разделяет строку по заданному шаблону.

import re
result = re.split('г', 'Программа')
print (result) #['Про', 'рамма']

re.sub(pattern, repl, string):

Этот метод ищет шаблон в строке и заменяет его на указанную подстроку. Если шаблон не найден, строка остается неизменной.

import re
result = re.sub('Python', 'PHP', 'Программа на языке Python')
print (result) #Программа на языке PHP

Также шаблон регулярного выражения может состоять из следующих метасимволов.

Метасимвол

Соответствие

Пример

.

Любой символ

py..on

^

Начало строки

^py

$

Конец строки

...on$

*

Повторение фрагмента ноль или более раз

py*

+

Повторение фрагмента один или более раз

py+

?

Фрагмент либо присутствует, либо отсутствует

py?

{ }

Множественное повторение

a{ 3 }

[ ]

Класс символов

[ a-z ]

\

Специальная последовательность

\s

|

Фрагмент слева или фрагмент справа

a | b

( )

Группировка выражений

( ... )

Примеры:

import re
result = re.findall('[0-9]+', '23, слово, 14, слово, 26, слово 29')
print (result) #['23', '14', '26', '29']
import re
#\w - любая цифра или буква (\W — все, кроме буквы или цифры)
result = re.findall('\w*программ\w*',
    'Программа состоит из нескольких небольших программ, называемых подпрограммами',
    re.IGNORECASE)
print (result) #['Программа', 'программ', 'подпрограммами']
from re import *
pattern = \
  compile('[-a-z0-9_.]+@([-a-z0-9]+\.)+[a-z]{2,6}')
string = 'Мой почтовый адрес Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.. Напишите мне.'
print (pattern.search(string).group()) #Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.
print (pattern.search(string).group(0)) #Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.
print (pattern.search(string).group(1)) #mail.

Здесь мы используем compile(), чтобы поместить регулярное выражение в отдельный объект, после чего его можно использовать повторно.