Чтение онлайн

на главную - закладки

Жанры

Язык программирования Python
Шрифт:

Листинг

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» соответствует группе с номером 1, выделенной с помощью скобок.

Листинг

r»(?P<var>\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):

«"«Отладка рег. выражения. Перед отладкой лучше убрать лишние скобки """

last_good = ""

for i in range(1, len(regex)):

try:

if re.compile(regex[:i]).match(example):

last_good = regex[:i]

except:

continue

return last_good

example = ""«Nov 27 15:57:59 lap kernel: PAY: IN=eth0 OUT=

MAC=00:50:da:d9:df:a2:00:00:1c:b0:c9:db:08:00 SRC=192.168.1.200 DST=192.168.1.115

LEN=1500 TOS=0x00 PREC=0x00 TTL=64 ID=31324 DF PROTO=TCP SPT=8080 DPT=1039

WINDOW=17520 RES=0x00 ACK PSH URGP=0»""

log_re = r»"«[A–Za–z]{3}\s+\d+\s+\d\d\d\d:\d\d) \S+ kernel: PAY: .+

DST=(?P<dst>\S+).* LEN=(?P<len>\d+).* DPT=(?P<dpt>\d+) """

print debug_regex(log_re, example)

Функция debug_regex пробует сопоставлять пример с увеличивающимися порциями регулярного выражения и возвращает последнее удавшееся сопоставление:

Листинг

[A–Za–z]{3}\s+\d+\s+\d\d

Сразу видно, что не поставлен символ :.

Примеры применения регулярного выражения

Поделиться:
Популярные книги

Мастер 7

Чащин Валерий
7. Мастер
Фантастика:
фэнтези
боевая фантастика
попаданцы
технофэнтези
аниме
5.00
рейтинг книги
Мастер 7

Бастард Императора. Том 2

Орлов Андрей Юрьевич
2. Бастард Императора
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Бастард Императора. Том 2

Старшеклассник без клана. Апелляция кибер аутсайдера 2

Афанасьев Семен
2. Старшеклассник без клана. Апелляция аутсайдера
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Старшеклассник без клана. Апелляция кибер аутсайдера 2

Барон Дубов 4

Карелин Сергей Витальевич
4. Его Дубейшество
Фантастика:
юмористическое фэнтези
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Барон Дубов 4

Я царь. Книга XXVIII

Дрейк Сириус
28. Дорогой барон!
Фантастика:
боевая фантастика
аниме
попаданцы
5.00
рейтинг книги
Я царь. Книга XXVIII

Протокол "Наследник"

Лисина Александра
1. Гибрид
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Протокол Наследник

Девочка из прошлого

Тоцка Тала
3. Айдаровы
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Девочка из прошлого

Кодекс Охотника. Книга XII

Винокуров Юрий
12. Кодекс Охотника
Фантастика:
боевая фантастика
городское фэнтези
аниме
7.50
рейтинг книги
Кодекс Охотника. Книга XII

Первый среди равных

Бор Жорж
1. Первый среди Равных
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Первый среди равных

Древесный маг Орловского княжества

Павлов Игорь Васильевич
1. Орловское княжество
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Древесный маг Орловского княжества

Наследие Маозари

Панежин Евгений
1. Наследие Маозари
Фантастика:
рпг
попаданцы
аниме
5.80
рейтинг книги
Наследие Маозари

Лекарь Империи 3

Карелин Сергей Витальевич
3. Лекарь Империи
Фантастика:
городское фэнтези
аниме
дорама
фэнтези
попаданцы
5.00
рейтинг книги
Лекарь Империи 3

Вперед в прошлое 7

Ратманов Денис
7. Вперед в прошлое
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Вперед в прошлое 7

Князь Андер Арес 2

Грехов Тимофей
2. Андер Арес
Фантастика:
рпг
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Князь Андер Арес 2