В языке 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 = 'Мой почтовый адрес admin@mail.ru
				document.getElementById('cloakec0fd598bb783b0a98d9a8e01ea90ad2').innerHTML = '';
				var prefix = 'ma' + 'il' + 'to';
				var path = 'hr' + 'ef' + '=';
				var addyec0fd598bb783b0a98d9a8e01ea90ad2 = 'admin' + '@';
				addyec0fd598bb783b0a98d9a8e01ea90ad2 = addyec0fd598bb783b0a98d9a8e01ea90ad2 + 'mail' + '.' + 'ru';
				var addy_textec0fd598bb783b0a98d9a8e01ea90ad2 = '&#97;dm&#105;n' + '&#64;' + 'm&#97;&#105;l' + '&#46;' + 'r&#117;';document.getElementById('cloakec0fd598bb783b0a98d9a8e01ea90ad2').innerHTML += '<a ' + path + '\'' + prefix + ':' + addyec0fd598bb783b0a98d9a8e01ea90ad2 + '\'>'+addy_textec0fd598bb783b0a98d9a8e01ea90ad2+'<\/a>';
		. Напишите мне.'
print (pattern.search(string).group()) #admin@mail.ru
				document.getElementById('cloak9fdde21da8b2f8e8ad96701f0a782f91').innerHTML = '';
				var prefix = '&#109;a' + 'i&#108;' + '&#116;o';
				var path = 'hr' + 'ef' + '=';
				var addy9fdde21da8b2f8e8ad96701f0a782f91 = '&#97;dm&#105;n' + '&#64;';
				addy9fdde21da8b2f8e8ad96701f0a782f91 = addy9fdde21da8b2f8e8ad96701f0a782f91 + 'm&#97;&#105;l' + '&#46;' + 'r&#117;';
				var addy_text9fdde21da8b2f8e8ad96701f0a782f91 = '&#97;dm&#105;n' + '&#64;' + 'm&#97;&#105;l' + '&#46;' + 'r&#117;';document.getElementById('cloak9fdde21da8b2f8e8ad96701f0a782f91').innerHTML += '<a ' + path + '\'' + prefix + ':' + addy9fdde21da8b2f8e8ad96701f0a782f91 + '\'>'+addy_text9fdde21da8b2f8e8ad96701f0a782f91+'<\/a>';
		
print (pattern.search(string).group(0)) #admin@mail.ru
				document.getElementById('cloak56fd8ee3674094556d38d5cb37e9892d').innerHTML = '';
				var prefix = '&#109;a' + 'i&#108;' + '&#116;o';
				var path = 'hr' + 'ef' + '=';
				var addy56fd8ee3674094556d38d5cb37e9892d = '&#97;dm&#105;n' + '&#64;';
				addy56fd8ee3674094556d38d5cb37e9892d = addy56fd8ee3674094556d38d5cb37e9892d + 'm&#97;&#105;l' + '&#46;' + 'r&#117;';
				var addy_text56fd8ee3674094556d38d5cb37e9892d = '&#97;dm&#105;n' + '&#64;' + 'm&#97;&#105;l' + '&#46;' + 'r&#117;';document.getElementById('cloak56fd8ee3674094556d38d5cb37e9892d').innerHTML += '<a ' + path + '\'' + prefix + ':' + addy56fd8ee3674094556d38d5cb37e9892d + '\'>'+addy_text56fd8ee3674094556d38d5cb37e9892d+'<\/a>';
		
print (pattern.search(string).group(1)) #mail.

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