Извлечение даты из файла журнала? - PullRequest
1 голос
/ 29 апреля 2019

Я пытаюсь создать объект DateTime из строки примера файла журнала.

Я пытался использовать регулярное выражение для синтаксического анализа этого, но он терпит неудачу всякий раз, когда я добираюсь до формата файла журнала, у которого есть объединенная буква 'T' для второй половины времени. Моя тестовая строка 'ОШИБКА 2019-02-03T23: 21: 20 не могу найти файл'

def convert_to_datetime(line):
    match = re.search('\d{4}-\d{2}-\d{2}', line)

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

Ответы [ 5 ]

1 голос
/ 29 апреля 2019

Не уверен, что если вы этого хотите, но генерация объекта даты / времени из строки может быть очень сложной, если ваша строка имеет свободный стиль. Но у нас есть dateutil пакет, чтобы помочь:

>>> import dateutil.parser
>>> s = 'ERROR 2019-02-03T23:21:20 cannot find file'
>>> dateutil.parser.parse(s, fuzzy=True)
datetime.datetime(2019, 2, 3, 23, 21, 20)

Так что, если вам это нравится, это функция:

def convert_to_datetime(s):
    return dateutil.parser.parse(s, fuzzy=True)
1 голос
/ 29 апреля 2019

Вам нужно распечатать группы, которые вы тоже выбрали.

import re

s = 'ERROR 2019-02-03T23:21:20 cannot find file'
match = re.search('\d{4}-\d{2}-\d{2}', s)
print(match.group(0))
#2019-02-03

Также, если вы хотите получить всю строку даты и времени, вы можете сделать

import re
s = 'ERROR 2019-02-03T23:21:20 cannot find file'
match = re.search('\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}', s)
print(match.group(0))
#2019-02-03T23:21:20

После этого, если хотитечтобы получить объект datetime, вы можете использовать библиотеку https://pypi.org/project/python-dateutil/

from dateutil import parser
import re

s = 'ERROR 2019-02-03T23:21:20 cannot find file'
match = re.search('\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}', s)

#Datetime string
dt = match.group(0)

#Datetime object
dt_obj = parser.parse(dt)
print(dt_obj)
#2019-02-03 23:21:20

print(type(dt_obj))
#<class 'datetime.datetime'>

. Или лучшее решение, использовать функцию parser, определенную выше с fuzzy=True

from dateutil import parser

s = 'ERROR 2019-02-03T23:21:20 cannot find file'
print(parser.parse(s, fuzzy=True))
#2019-02-03 23:21:20
0 голосов
/ 29 апреля 2019

В зависимости от того, в каком формате вы хотите получить конечную строку, есть два способа сделать это:

import re


def convert_to_datetime(line: str):
    match = re.search('\d{4}-\d{2}-\d{2}', line.strip('T')).group()
    match += ' | ' + re.search('\d{2}:\d{2}:\d{2}', line).group()
    return match


def cut_out_datetime(line: str):
    line = re.sub('ERROR ', "", line)
    line = re.sub('T', " | ", line)
    return line


s = 'ERROR 2019-02-03T23:21:20'
print('   Test string: ', s)
print()
print('Extract method: ', convert_to_datetime(s))
print(' "Trim" method: ', cut_out_datetime(s))


# OUTPUT:
   Test string:  ERROR 2019-02-03T23:21:20

Extract method:  2019-02-03 | 23:21:20
 "Trim" method:  2019-02-03 | 23:21:20

[Done] exited with code=0 in 0.05 seconds

Существуют и другие способы с позициями и срезами, но это больше всего похоже на ваш исходный код.Заменить |по своему усмотрению или разбейте время и дату на две отдельные строки ...

0 голосов
/ 29 апреля 2019

Во-первых, после прочтения https://docs.python.org/3/library/re.html будьте осторожны, чем в Python 3 \d точно не эквивалентно [0-9], затем будьте осторожны, если нет совпадений pattern.match вызовет ошибку, попробуйте что-то вроде

pattern = re.compile('[0-9]{4}-[0-9]{2}-[0-9]{2}')

if pattern.search(line):
    matches.append(pattern.search(line))
...

0 голосов
/ 29 апреля 2019

Твои близкие.Вам просто нужно получить результат:

def convert_to_datetime(line):
    match = re.search('\d{4}-\d{2}-\d{2}', line)
    return match.group() if match else "No match"

Тест:

t = convert_to_datetime('ERROR 2019-02-03T23:21:20 cannot find file')
print(t)

Выход:

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