В языке 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 = 'admin' + '@' + 'mail' + '.' + 'ru';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 = 'ma' + 'il' + 'to';
var path = 'hr' + 'ef' + '=';
var addy9fdde21da8b2f8e8ad96701f0a782f91 = 'admin' + '@';
addy9fdde21da8b2f8e8ad96701f0a782f91 = addy9fdde21da8b2f8e8ad96701f0a782f91 + 'mail' + '.' + 'ru';
var addy_text9fdde21da8b2f8e8ad96701f0a782f91 = 'admin' + '@' + 'mail' + '.' + 'ru';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 = 'ma' + 'il' + 'to';
var path = 'hr' + 'ef' + '=';
var addy56fd8ee3674094556d38d5cb37e9892d = 'admin' + '@';
addy56fd8ee3674094556d38d5cb37e9892d = addy56fd8ee3674094556d38d5cb37e9892d + 'mail' + '.' + 'ru';
var addy_text56fd8ee3674094556d38d5cb37e9892d = 'admin' + '@' + 'mail' + '.' + 'ru';document.getElementById('cloak56fd8ee3674094556d38d5cb37e9892d').innerHTML += '<a ' + path + '\'' + prefix + ':' + addy56fd8ee3674094556d38d5cb37e9892d + '\'>'+addy_text56fd8ee3674094556d38d5cb37e9892d+'<\/a>';
print (pattern.search(string).group(1)) #mail.
Здесь мы используем compile(), чтобы поместить регулярное выражение в отдельный объект, после чего его можно использовать повторно.