Добрый день. Я сейчас прохожу курс повышения квалификации - "Профессиональное веб-программирование". Мне нужно получить диплом по этому курсу. Я так полагаю нужно его оплатить чтобы получить диплом о повышении квалификации. Как мне оплатить этот курс?
|
Обработка текстов. Регулярные выражения. Unicode
Примеры применения регулярного выражения
Обработка лога
Следующий пример регулярного выражения позволит выделить из лога записи с определенной меткой и подать их в сокращенном виде:
import re log_re = re.compile(r"""(?P<date>[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+) """) for line in open("message.log"): m = log_re.match(line) if m: print "%(date)s %(dst)s:%(dpt)s size=%(len)s" % m.groupdict()
В результате получается
Nov 27 15:57:59 192.168.1.115:1039 size=1500 Nov 27 15:57:59 192.168.1.200:8080 size=40 Nov 27 15:57:59 192.168.1.115:1039 size=515 Nov 27 15:57:59 192.168.1.200:8080 size=40 Nov 27 15:57:59 192.168.1.115:1039 size=40 Nov 27 15:57:59 192.168.1.200:8080 size=40 Nov 27 15:57:59 192.168.1.115:1039 size=40
Анализ записи числа
Хороший пример регулярного выражения можно найти в модуле fpformat. Это регулярное выражение позволяет разобрать запись числа (в том виде, в каком числовой литерал принято записывать в Python):
decoder = re.compile(r'^([-+]?)0*(\d*)((?:\.\d*)?)(([eE][-+]?\d+)?)$') # Следующие части числового литерала выделяются с помощью групп: # \0 - весь литерал # \1 - начальный знак или пусто # \2 - цифры слева от точки # \3 - дробная часть (пустая или начинается с точки) # \4 - показатель (пустой или начинается с 'e' или 'E')
Например:
import re decoder = re.compile(r'^([-+]?)0*(\d*)((?:\.\d*)?)((?:[eE][-+]?\d+)?)$') print decoder.match("12.234").groups() print decoder.match("-0.23e-7").groups() print decoder.match("1e10").groups()
Получим
('', '12', '.234', '') ('-', '', '.23', 'e-7') ('', '1', '', 'e10')
Множественная замена
В некоторых приложениях требуется производить в тексте сразу несколько замен. Для решения этой задачи можно использовать метод sub() вместе со специальной функцией, которая и будет управлять заменами:
import re def multisub(subs_dict, text): def _multisub(match_obj): return str(subs_dict[match_obj.group()]) multisub_re = re.compile("|".join(subs_dict.keys())) return multisub_re.sub(_multisub, text) repl_dict = {'one': 1, 'two': 2, 'three': 3} print multisub(repl_dict, "One, two, three")
Будет выведено
One, 2, 3
В качестве упражнения предлагается сделать версию, которая бы не учитывала регистр букв.
В приведенной программе вспомогательная функция _multisub() по полученному объекту с результатом сравнения возвращает значение из словаря с описаниями замен subs_dict.
Работа с несколькими файлами
Для упрощения работы с несколькими файлами можно использовать модуль fileinput. Он позволяет обработать в одном цикле строки всех указанных в командной строке файлов:
import fileinput for line in fileinput.input(): process(line)
В случае, когда файлов не задано, обрабатывается стандартный ввод.