RegExp
Регуля́рные выраже́ния (англ. regular expressions, сокр. RegExp, RegEx, жарг. регэ́кспы или ре́гексы) это формальный язык поиска и осуществления манипуляций с подстроками в тексте, основанный на использовании метасимволов (символов-джокеров, англ. wildcard characters). По сути это строка- образец (англ. pattern, по-русски её часто называют «шаблоном», «маской»), состоящая из символов и метасимволов и задающая правило поиска. Функции для работы со строками с помощью регулярных выражений находятся в модуле по имени re (regular expressions)
Для чего нужны регулярные выражения? Регулярные выражения применяют для: а) поиска подстроки, удовлетворяющей шаблону регулярного выражения, в строке. б) поиска и замены подстроки, удовлетворяющей шаблону регулярного выражения, в строке. в) проверки на соответствие заданной строки шаблону. г) извлечения подстроки, удовлетворяющей шаблону регулярного выражения, из строки.
Создать откомпилированный шаблон регулярного выражения позволяет функция compile(). Функция имеет следующий формат: = re.compile( [, ]) Перед строками, содержащими регулярные выражения, указан модификатор r. Иными словами, мы используем неформатированные строки. Если модификатор не указать, то все слеши необходимо будет экранировать. p = re.compile(r^\w+$) p = re.compile(^\\w+$)
Специальные обозначения
Помимо специальных обозначений, в регулярном выражении только буквы и цифры могут входить в качестве самих себя. Для внесения других символов необходимо использовать обратную косую черту. Например, скобку можно задать как «\ (» С регулярным выражением можно не только сопоставлять строки (подходит – не подходит), но и искать строки, удовлетворяющие регулярному выражению, в тексте. ____________ В таблице ниже приведены регулярные выражения и примеры сопоставимых с ними и не сопоставимых с ними строк
«Жадные» выражения Все квантификаторы являются «жадными». При поиске соответствия ищется самая длинная подстрока, соответствующая шаблону, и не учитываются более короткие соответствия. Рассмотрим это на примере. Получим содержимое всех тегов вместе с тегами: Чтобы ограничить «жадность», необходимо после квантификатора указать символ ? >>> s = " Text1 Text2 Text3 " >>> p = re.compile(r".* ", re.S) >>> p.findall(s) [ Text1 Text2 Text3 ] >>> s = " Text1 Text2 Text3 " >>> p = re.compile(r".*? ", re.S) >>> p.findall(s) [ Text1, Text3 ]
*? - «не жадный» («ленивый») эквивалент * +? - «не жадный» («ленивый») эквивалент + {n,}? - «не жадный» («ленивый») эквивалент {n,} >>>s = " Text1 Text2 Text3 " >>> p = re.compile(r" (.*?) ", re.S) >>> p.findall(s) [Text1, Text3] Если необходимо получить содержимое без тегов, то нужный фрагмент внутри шаблона следует разместить внутри круглых скобок
Группы ( )Простая группа с захватом. (?: )Группа без захвата. То же самое, но заключённое в скобках выражение не добавляется к списку захваченных фрагментов. Например, если требуется найти или «здравствуйте», или «здрасте», но не важно, какое именно приветствие найдено, можно воспользоваться выражением здра(?:сте|вствуйте). (?= )Группа с проверкой впереди (zero-width positive lookahead assertion). Продолжает поиск только если справа от текущей позиции в тексте находится заключённое в скобки выражение. При этом само выражение не захватывается. Например, говор(?=ить) найдёт «говор» в «говорить», но не «говорит».
К найденному фрагменту в круглых скобках внутри шаблона можно обратиться с помощью механизма обратных ссылок. \1 – порядковый номер круглых скобок >>> s = " Text1 Text2 Text3 " >>> p = re.compile(r" (.*?) ", re.S | re.I) >>> p.findall(s) [(b, Text1), (I, Text3)]
Функции Для поиска первого совпадения с шаблоном предназначены следующие функции: match() – проверяет соответствие с началом сторки re.match(, [, ]) >>> p = r[0-9]+ >>> print Найдено if re.match(p, str123) else Нет Нет >>> print Найдено if re.match(p, 123str) else Нет Найдено >>> p = re.compile(r[0-9]+) >>> print Найдено if re.match(p, 123str) else Нет Найдено
search() – проверяет соответствие с любой частью строки re.search(, [, ]) >>> p = r[0-9]+ >>> print Найдено if re.search(p, str123) else Нет Найдено >>> p = re.compile(r[0-9]+) >>> print Найдено if re.search(p, str123) else Нет Найдено
Проверка на соответствие шаблону # -*- coding: cp1251 -*- import re = raw_input(Введите ) pe = p = re.compile(pe, re.I) m = p.search( ) if not m: print не соответствует шаблону else: print , m.group(0), соответствует шаблону print ящик:, m.group(1), домен:, m.group(2) Результат выполнения: Введите соответствует шаблону ящик: unicross домен: mail.ru
Для поиска всех совпадений с шаблоном предназначены следующие функции: findall() – ищет все совпадения с шаблоном re.findall(, [, ]) >>> p = r[0-9]+ >>> re.findall(p, ) [1, 2, 3, 4, 5, 6] >>> p = re.compile(r[0-9]+) >>> re.findall(p, ) [1, 2, 3, 4, 5, 6]
finditer() – аналогично функции findall(), но возвращает итератор, а не список. re.finditer(, [, ]) Получим содержимое между тегами: >>> p = re.compile(r (.+?), re.I | re.S) >>> s = Text1 Text2 Text3 >>> for m in re.finditer(p, s): print m.group(1) Text1 Text3
Для замены в строке с помощью регулярных выражений предназначены следующие функции и методы: sub() – ищет все совпадения с шаблоном и заменяет их указанным значением. Если совпадения не найдены, возвращается исходная строка. subn() – аналогичен sub(), но возвращает не строку, а кортеж из двух элементов – измененной строки и количества произведенных замен. re.subn(,, [, ]) >>> p = r200[79] >>> re.subn(p, 2001, 2007, 2008, 2009, 2010) (2001, 2008, 2001, 2010, 2)