Анализ временных меток с помощью регулярных выражений Python ':' символ не найден - PullRequest
0 голосов
/ 31 декабря 2018

Я изучаю Python и пытаюсь реализовать регулярное выражение для получения метки времени из файла журнала приложения (обычно я использую grep , cut и awk для этого)

Мои лог-файлы содержат много строк, начинающихся с даты и времени, следующих

18.12.19 14:03:16 [ ..... # message error
18.12.19 14:03:16 [
:

Обычно я использую простую команду grep grep "14\:03\:16" mytext, и это выражение работает "14:03: 16 ", поэтому после исследования я придумал это регулярное выражение:

Где res - одна из строк выше

datap = re.compile(r'(\d{2}):(\d{2}):(\d{2})')
m = datap.match(res)

Это ничего не находит, тогда как

datap = re.compile(r'(\d{2}).(\d{2}).(\d{2})')
m = datap.match(re

Захватывает дату.

Почему символ : не найден?Я попытался использовать \:, и он также не работает.Заранее спасибо.

1 Ответ

0 голосов
/ 31 декабря 2018

re.match пытается сопоставить регулярное выражение с начала строки.

Из документов:

Если ноль или более символов вначало строки соответствует шаблону регулярного выражения, возвращает соответствующий объект соответствия.Вернуть None, если строка не соответствует шаблону;обратите внимание, что это отличается от совпадения нулевой длины.

Когда вы сделали

datap = re.compile(r'(\d{2}).(\d{2}).(\d{2})')
m = datap.match(res)

, регулярное выражение фактически соответствовало дате, а не времени (потому что это в началестроки):

print(m)
# <re.Match object; span=(0, 8), match='18.12.19'>

Если вы используете re.search, то вы получите ожидаемый результат:

import re

res = '18.12.19 14:03:16 [ ..... # message error'
datap = re.compile(r'(\d{2}):(\d{2}):(\d{2})')
m = datap.search(res)
print(m)
# <re.Match object; span=(9, 17), match='14:03:16'>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...