В результате успешной компиляции шаблона функцией re.compile()
SRE_Pattern), который имеет несколько методов, некоторые из них будут рассмотрены. Как обычно, подробности и информация о дополнительных аргументах — в документации по Python.match(s)
Сопоставляет строку s
SRE_Match). В случае неудачи возвращает None. Сопоставление начинается от начала строки.search(s)
Аналогичен match(s)
s.split(s[, maxsplit=0])
Разбивает строку на подстроки, разделенные подстроками, заданными шаблоном. Если в шаблоне выделены группы, они попадут в результирующий список, перемежаясь с подстроками между разделителями. Если указан maxsplit
maxsplit разбиений.findall(s)
Ищет все неперекрывающиеся подстроки s
finditer(s)
Возвращает итератор по объектам с результатами сравнения для всех неперекрывающихся подстрок, удовлетворяющих шаблону.
sub(repl, s)
Заменяет в строке s
count, если он задан) вхождения неперекрывающихся подстрок, удовлетворяющих шаблону, на строку, заданную с помощью repl. В качестве repl может выступать строка или функция. Возвращает строку с выполненными заменами. В первом случае строка repl подставляется не просто так, а интерпретируется с заменой вхождений "\номер" на группу с соответствующим номером и вхождений "\g<имя>" на группу с номером или именем имя. В случае, когда repl — функция, ей передается объект с результатом каждого успешного сопоставления, а из нее возвращается строка для замены.subn(repl, s)
Аналогичен sub()
В следующем примере строка разбивается на подстроки по заданному шаблону:
>>> import re
>>> delim_re = re.compile(r"[:,;]")
>>> text = "This,is;example"
>>> print delim_re.split(text)
['This', 'is', 'example']
А теперь можно узнать, чем именно были разбиты строки:
>>> delim_re = re.compile(r"([:,;])")
>>> print delim_re.split(text)
['This', ',', 'is', ';', 'example']
Примеры шаблонов
Владение регулярными выражениями может существенно ускорить построение алгоритмов для обработки данных. Лучше всего познакомиться с шаблонами на конкретных примерах:
r"\b\w+\b"
Соответствует слову из букв и знаков подчеркивания.
r"[+-]?\d+"
Соответствует целому числу. Возможно, со знаком.
r"\([+-]?\d+\)"
Число, стоящее в скобках. Скобки используются в самих регулярных выражениях, поэтому они экранируются "\"
r"[a–cA–C]{2}"
Соответствует строке из двух букв «a
b» или «c». Например, «Ac», «CC», «bc».r"aa|bb|cc|AA|BB|CC"
Строка из двух одинаковых букв.
r"([a–cA–C])\1"
Строка из двух одинаковых букв, но шаблон задан с использованием групп
r"aa|bb"
Соответствует «aa
bb»r"a(a|b)b"
Соответствует «aab
abb»r"^(?:\d{8}|\d{4}):\s*(.*)$"
Соответствует строке, которая начинается с набора из восьми или четырех цифр и двоеточия. Все, что идет после двоеточия и после следующих за ним пробелов, выделяется в группу с номером 1, тогда как набор цифр в группу не выделен.
r"(\w+)=.*\b\1\b"
Слова слева и справа от знака равенства присутствуют. Операнд "\1"
r"(?P\w+)=.*\b(?P=var)\b"
То же самое, но теперь используется именованная группа var
r"\bregular(?=\s+expression)"
Соответствует слову «regular
expression»r"(?<=regular )expression"
Соответствует слову «expression
regular»и один пробел.Следует заметить, что примеры со взглядом назад могут сильно влиять на производительность, поэтому их не стоит использовать без особой необходимости.
Отладка регулярных выражений
Следующий небольшой сценарий позволяет отлаживать регулярное выражение, при условии, что есть пример строки, которой шаблон должен удовлетворять. Взят кусочек лога iptables, его необходимо разобрать для получения полей. Интересны строки, в которых после kernel:
PAY:, а в этих строках нужно получить дату, значения DST, LEN и DPT:import re
def debug_regex(regex, example):