Программирование. Питон.
Лекция 6.
Регулярные выражения
Регулярные выражения позволяют узнать, соответствует ли строка некоторому шаблону.
В примере с заменой некоторой строки в файле мы должны были точно задать, что мы ищем и что заменяем, например
for line in input_file:
output_file. write(line. replace(' test ', ' win '))
для замены одной строки другой для каждого вхождения.
Однако часто требуется провести манипуляции (замену, подстановку, выборку) не для конкретной подстроки, а для целой группы подстрок.
В таком случае используются регулярные выражения – то есть задается шаблон для поиска.
В питоне регулярными выражениями заведует модуль re
Большинство букв и символов соответствуют сами себе. Например, регулярное выражение test будет в точности соответствовать строке test
Из этого правила есть исключения; некоторые символы это специальные метасимволы, и сами себе не соответствуют. Вместо этого они указывают, что должна быть найдена некоторая необычная вещь, или влияют на другие части регулярного выражения, повторяя или изменяя их значение.
Список метасимволов для регулярных выражений
. ^ $ * + ? { [ ] \ | ( )
[] – набор символов, который ищется.
шаблону 'к[ио]т' соответствуют строки 'кит' и 'кот'
[^] – «все, кроме»
шаблону 'к[^и5j]т' соответствуют строки 'кот', 'к1т', 'кqт', но не 'кит' и не 'кjт'
[1-8] – любой символ из диапазона от 1 до 8
\d
Соответствует любой цифре; эквивалент класса [0-9].
\D
Соответствует любому нечисловому символу; эквивалент класса [^0-9].
\s
Соответствует любому символу whitespace; эквивалент [ \t\n\r\f\v].
\S Соответствует любому не-whitespace символу; эквивалент [^ \t\n\r\f\v].
\w
Соответствует любой букве или цифре; эквивалент [a-zA-Z0-9_].
\W
Наоборот; эквивалент [^a-zA-Z0-9_]
Метасимвол повтора 0 и более раз: *
Например, ca*t будет соответствовать
ct (0 символов a)
cat (1 символ a)
caaat (3 символа a), и так далее.
Метасимвол повтора 1 и более раз: +
Например, ca+t будет соответствовать
cat (1 символ a)
caaat (3 символа a), и так далее.
Метасимвол повтора 0 или 1 раз: ?
home-?brew
соответствует
homebrew и home-brew
Использование
import re
p = pile('ab*') #компилирование регулярного выражения
альтернатива
p = pile('ab*', re. IGNORECASE) #нечувствительное к регистру
Использование:
match() | Определить, начинается ли совпадение регулярного выражения с начала строки |
search() | Сканировать всю строку в поисках всех мест совпадений с регулярным выражением |
findall() | Найти все подстроки совпадений с регулярным выражением и вернуть их в виде списка |
Если результат поиска был возвращен с помощью match или search, то к нему применимы методы:
group() | Вернуть строку, сошедшуюся с регулярным выражением |
start() | Вернуть позицию начала совпадения |
end() | Вернуть позицию конца совпадения |
span() | Вернуть кортеж (start, end) позиций совпадения |
Пример:
Поиск первой последовательности, состоящей только из букв
import re
p = pile('[a-z]+')
m = p. match( 'strin1g goes here' )
if m:
print 'Match found: ', m. group()
else:
print 'No match'
Выведет на экран
>>> Match found: strin
Пример:
Поиск всех последовательности, состоящей только из букв
import re
p = pile('[a-z]+')
m = p. findall( 'strin1g goes here' )
if m:
print 'Match found: ', m
else:
print 'No match'
Выведет на экран
>>>Match found: ['strin', 'g', 'goes', 'here']


