В языке 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(), чтобы поместить регулярное выражение в отдельный объект, после чего его можно использовать повторно.