Язык программирования Python

       

Отладка регулярных выражений


Следующий небольшой сценарий позволяет отлаживать регулярное выражение, при условии, что есть пример строки, которой шаблон должен удовлетворять. Взят кусочек лога 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

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



Содержание раздела