Регулярное выражение для поиска даты в журнале доступа Apache - PullRequest
1 голос
/ 19 мая 2009

Я пишу скрипт на Python для извлечения данных из нашего журнала доступа Apache на 2 ГБ. Вот одна строка из журнала.

81.52.143.15 - - [01/Apr/2008:00:07:20 -0600] "GET /robots.txt HTTP/1.1" 200 29 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1) VoilaBot BETA 1.2 (http://www.voila.com/)"

Я пытаюсь получить часть даты из этой строки, и регулярное выражение подводит меня, и я не знаю почему. Вот мой код Python:

l = 81.52.143.15 - - [01/Apr/2008:00:07:20 -0600] "GET /robots.txt HTTP/1.1" 200 29 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1) VoilaBot BETA 1.2 (http://www.voila.com/)"

re.match(r"\d{2}/\w{3}/\d{4}", l)

ничего не возвращает. Также не делают следующее:

re.match(r"\d{2}/", l)
re.match(r"\w{3}", l)

или что-нибудь еще, что я могу даже получить часть даты. Что я недопонимаю?

Ответы [ 4 ]

5 голосов
/ 19 мая 2009

match () ищет совпадение в начале строки. Используйте search (), чтобы найти совпадение в любом месте строки. Больше информации здесь: http://docs.python.org/library/re.html#matching-vs-searching

1 голос
/ 19 октября 2010

Или вы можете использовать один из уже доступных парсеров Python Apache, например:

  • Apachelogs
  • Logtools
  • Logrep (Wtop пакет)
0 голосов
/ 20 мая 2009

Вместо использования регулярных выражений для получения даты, может быть проще просто разбить строку на пробелы и извлечь дату:

 l = '81.52.143.15 - - [01/Apr/2008:00:07:20 -0600] "GET /robots.txt HTTP/1.1" 200 29 "-" Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1) VoilaBot BETA 1.2 (http://www.voila.com/)"'
 date = l.split()[3]

Если вы обрабатываете очень большие файлы, это, вероятно, более эффективно, чем использование регулярных выражений.

0 голосов
/ 19 мая 2009

match() пытается сопоставить всю строку. Попробуйте search() вместо.

См. Также Python Regular Expression HOWTO и Python page на всегда превосходной регулярных выражениях.info .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...