Регулярные выражения в Python

Материал из Институт биоинформатики
Перейти к: навигация, поиск
¯ \ _ (ツ) _ / ¯

Регулярные выражения (англ. regular expressions, жарг. регэкспы или регексы или регулярочки) — система обработки текста, основанная на специальной системе записи образцов для поиска. Образец (англ. pattern), задающий правило поиска, по-русски также иногда называют «шаблоном», «маской».

Сейчас регулярные выражения используются многими текстовыми редакторами и утилитами для поиска и изменения текста на основе выбранных правил. Многие языки программирования уже поддерживают регулярные выражения для работы со строками. Например, Perl и Tcl имеют встроенный в их синтаксис механизм обработки регулярных выражений. Набор утилит (включая редактор sed и фильтр grep), поставляемых в дистрибутивах Unix, одним из первых способствовал популяризации понятия регулярных выражений.

Регулярные выражения:

  • ”формальный язык поиска и осуществления манипуляций с подстроками в тексте” (с) Вики
  • способ задания ”шаблона” для поиска подстроки в строке использую специальные символы и правил
  • используются повсеместно и являются стандартом поиска в тексте


История

Истоки регулярных выражений лежат в теории автоматов, теории формальных языков и классификации формальных грамматик по Хомскому[3]. Эти области изучают вычислительные модели (автоматы) и способы описания и классификации формальных языков. В 1940-х гг. Уоррен Маккалок и Уолтер Питтс описали нейронную систему, используя простой автомат в качестве модели нейрона. Математик Стивен Клини позже описал эти модели, используя свою систему математических обозначений, названную «регулярные множества». Кен Томпсон встроил их в редактор QED, а затем в редактор ed под UNIX. С этого времени регулярные выражения стали широко использоваться в UNIX и UNIX-подобных утилитах, например в expr, awk, Emacs, vi, lex и Perl.

Регулярные выражения в Perl и Tcl происходят от реализации, написанной Генри Спенсером. Филип Хейзел разработал библиотеку PCRE (англ. Perl-compatible regular expressions — Perl-совместимые регулярные выражения), которая используется во многих современных инструментах, таких как PHP и Apache.

Регулярные выражения в Python

Модуль "re"

В python можно получить доступ ко всей силе регулярных выражений в модуле re: import re[1]

Документация модуля re

Выполнение сопоставлений

В модуле re имеются 3 наиболее популярные функции

Функции Цель
match() Определить, начинается ли совпадение регулярного выражения с начала строки
search() Сканировать всю строку в поисках всех мест совпадений с регулярным выражением
findall() Найти все подстроки совпадений с регулярным выражением и вернуть их в виде списка


Синтаксис

Метасимволы

  • ^ - Метасимвол начала строки
  • $ - Метасимвол конца строки
  • ( ) - Позволяют группировать группы символов
  • * - Несколько (или ноль) вхождений
  • + -Одно или более вхождений
  • | (a|b) – a или b
  • \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_].

Полнвй список с описанием метасимволов доступен по ссылке


Подключение модуля re

Подключение можуля re в Python осуществляется командой:


import re

Примеры

Пример 1 Слово в предложении

Попробуем найти слово ”etc” в предложении ”etc abc ebc etc eac”

import re

lst = re.findall(”etc”, ”etc abc ebc etc eac”)
print(lst) 

Выведет на печать: [”etc, ”etc”]



Пример 2 Любой символ

Мета-символ ”.” – шаблон описывающий любой символ

import re

lst = re.findall(”e.c”, ”etc abc ebc etc eac”)
print(lst) 

Выведет на печать: [’etc’, ’ebc’, ’etc’, ’eac’]


lst = re.findall(”e.c”, ”etc abc ebc etc e)c”)
print(lst) 

Выведет на печать: [’etc’, ’ebc’, ’etc’, ’e)c’]



Пример 3 \w

Что если нас не устраивает любой символ?

Нужна буква, для этого существует метамисвол ”\w”, который описывает все alpha-numeric symbols – буквы и цифры

import re

lst = re.findall(”e\wc”, ”etc abc ebc etc e)c”)
print(lst) 

Выведет на печать: [’etc’, ’ebc’, ’etc’]



Пример 4 \w+

Что, если мы не знаем число символов?

Для этого есть метасимволы повтора. Мы можем поставить ”+” после символа (или последовательности) если ожидаем, что данная последовательность встретится 1 или более раз. Или ”*”, если 0 или сколько-то раз.

import re

lst = re.findall(”\w+”, ”abaca)what’s that yo”)
print(lst) 

Выведет на печать: [’abaca’, ’what’, ’s’, ’that’, ’yo’]


results = re.findall("\w+", "words word12 swe1, .. mops,    , pizza, socks")
print(results) 

Выведет на печать: ["words", "word12", "swe1", "mops", "pizza", "socks"]



Пример 5 +

Найдем все строки, в которых сначала идут символы a, затем символы b, затем символы с

import re

example = ”aaabbc, adfdc, adfdcc, abc, aabbcccccc, abcc”
lst = re.findall(”a+b+c+”, example)
print(lst) 

Выведет на печать: [’aaabbc’, ’abc’, ’aabbcccccc’, ’abcc’]



Пример 6 Поиск прилагательных

Найдем все прилагательные (будем считать, что большинство прилагательных в английском языке оканчиваются на "yo")

import re

example = ”toska, stameska, kopyo, noyo, yayo, guru”
lst = re.findall(”\w+yo”, example)
print(lst) 

Выведет на печать: [’kopyo’, ’noyo’, ’yayo’]


Пример 7 Множества символов

Внутри квадратных скобок мы можем перечислить все символы, которые нас устраивают: мы можем написать регулярное выражение "[abc]bc", под которое подойдут строки abc, bbc, и cbc

import re

results = re.findall("[abc]bc", "abc bbc cbc abb")
print(results)


Другой способ задать множество символов: метасимвол альтерации "|" .

Опишем группу символов внутри круглых скобок и воспользуемся символов альтерации: "(a|b|c)bc"

results = re.findall("(a|b|c)bc", "abc bbc cbc abb")
print(results)


В отличие от множества символов задаваемого метасимволами [ ], знак альтерации можно использовать для неодносимволных последовательностей: под шаблон "(abc|abe|dd)x" таким образом будут подходить три строки -- "abcx", "abex" и "ddx".

Пример 7 Реализация повторов

Для реализации повтора можно использовать три различные конструкции:

  • Метасимволы { }, внутри которых можно расположить минимальное/максимальное число повторов, которые нас устраивают, или точное число повторов, которые мы ищем. Например под шаблон "A{3, 5}" подойдут все подстроки, состоящие из подряд идущих символов А, длиной от 3 до 5, а под "T{4}" подойдут только те подстроки, которые содержат 4 T подряд.
  • Метасимвол *. Данный метасимвол означает любое число вхождений символа (или группы символов). Таким образом под шаблон "A*" подходят все последовательности состоящие из любого количества А, идущих подряд, и пустая строка (так как ноль тоже подходит).
  • Метасимвол +. Данный метасимвол означает любое положительное число вхождений символа (или группы символов): от единицы до любого числа. Таким образом под шаблон "A+" подходят все все последовательности состоящие из любого числа А, идущих подряд. В отличие от "А*" пустая строка не подойдет.
import re

results = re.findall("A+", "AAATATAGCGC")
print(results)


results = re.findall("TA{2}", "AATATAGCGTATA")
print(results)

Пример 8 Группировка

Для группировки символов используются метасимволы "( )".

Группировка символов позволяет нам использовать повторы на последовательностях: таким образом под шаблон "(ab)+" подойдет любая строка вида "ababababab...ab".

Также группировка символов позволяет находить интересные подстроки внутри большого шаблона: например, если известно, что где-то в внутри строки есть подстрока "ID: 254", то с помощью шаблона "ID: (\d+)" (\d обозначает любую цифру) мы сможем найти только интересующее число 254:

import re

string = "ID: 254, ID: 14, ID: 88"
ids = re.findall("ID: (\d+)", string)
print(ids)


Важно понимать, что функция findall из модуля re, возвращает кортеж (tuple) из всех групп, которые она нашла, и если группы явно не указаны, она считает весь шаблон за одну группу. Если изменить шаблон на "(ID: (\d+))", то функция вернет кортежи с двумя элементами: всем шаблоном и его цифровым ID.


string = "ID: 254, ID: 14, ID: 88" ids = re.findall("(ID: (\d+))", string) print(ids)
  1. Документация модуля re в Python, https://docs.python.org/2/library/re.html документация