В языке 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('cloakdff71ad3831fb5b3a50f6e6119488f76').innerHTML = '';
				var prefix = 'ma' + 'il' + 'to';
				var path = 'hr' + 'ef' + '=';
				var addydff71ad3831fb5b3a50f6e6119488f76 = 'admin' + '@';
				addydff71ad3831fb5b3a50f6e6119488f76 = addydff71ad3831fb5b3a50f6e6119488f76 + 'mail' + '.' + 'ru';
				var addy_textdff71ad3831fb5b3a50f6e6119488f76 = '&#97;dm&#105;n' + '&#64;' + 'm&#97;&#105;l' + '&#46;' + 'r&#117;';document.getElementById('cloakdff71ad3831fb5b3a50f6e6119488f76').innerHTML += '<a ' + path + '\'' + prefix + ':' + addydff71ad3831fb5b3a50f6e6119488f76 + '\'>'+addy_textdff71ad3831fb5b3a50f6e6119488f76+'<\/a>';
		. Напишите мне.'
print (pattern.search(string).group()) #admin@mail.ru
				document.getElementById('cloakc4387e2abec41d8732d581f5175c1558').innerHTML = '';
				var prefix = '&#109;a' + 'i&#108;' + '&#116;o';
				var path = 'hr' + 'ef' + '=';
				var addyc4387e2abec41d8732d581f5175c1558 = '&#97;dm&#105;n' + '&#64;';
				addyc4387e2abec41d8732d581f5175c1558 = addyc4387e2abec41d8732d581f5175c1558 + 'm&#97;&#105;l' + '&#46;' + 'r&#117;';
				var addy_textc4387e2abec41d8732d581f5175c1558 = '&#97;dm&#105;n' + '&#64;' + 'm&#97;&#105;l' + '&#46;' + 'r&#117;';document.getElementById('cloakc4387e2abec41d8732d581f5175c1558').innerHTML += '<a ' + path + '\'' + prefix + ':' + addyc4387e2abec41d8732d581f5175c1558 + '\'>'+addy_textc4387e2abec41d8732d581f5175c1558+'<\/a>';
		
print (pattern.search(string).group(0)) #admin@mail.ru
				document.getElementById('cloak8ff4434cd095eaa415dc3b8d30a6a89a').innerHTML = '';
				var prefix = '&#109;a' + 'i&#108;' + '&#116;o';
				var path = 'hr' + 'ef' + '=';
				var addy8ff4434cd095eaa415dc3b8d30a6a89a = '&#97;dm&#105;n' + '&#64;';
				addy8ff4434cd095eaa415dc3b8d30a6a89a = addy8ff4434cd095eaa415dc3b8d30a6a89a + 'm&#97;&#105;l' + '&#46;' + 'r&#117;';
				var addy_text8ff4434cd095eaa415dc3b8d30a6a89a = '&#97;dm&#105;n' + '&#64;' + 'm&#97;&#105;l' + '&#46;' + 'r&#117;';document.getElementById('cloak8ff4434cd095eaa415dc3b8d30a6a89a').innerHTML += '<a ' + path + '\'' + prefix + ':' + addy8ff4434cd095eaa415dc3b8d30a6a89a + '\'>'+addy_text8ff4434cd095eaa415dc3b8d30a6a89a+'<\/a>';
		
print (pattern.search(string).group(1)) #mail.

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