从日志文件中提取日期?

时间:2019-04-29 14:33:32

标签: python datetime

我正在尝试从日志文件示例字符串创建DateTime对象。

我一直在尝试使用正则表达式来解析此内容,但是每当下半时使用连接字母'T'的日志文件格式时,它都会失败。我的测试字符串是“错误2019-02-03T23:21:20找不到文件”

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

我正在努力从字符串中获取完整的日期。我尝试了几种正则表达式,但我认为我使用了错误的语法。

5 个答案:

答案 0 :(得分:1)

您还需要打印匹配的组。

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

答案 1 :(得分:1)

不确定是否要这样做,但是如果字符串是一种自由样式,则从字符串生成 datetime对象可能会非常复杂。但是我们有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)

答案 2 :(得分:0)

您的关闭。您只需要得到结果:

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

答案 3 :(得分:0)

首先,阅读https://docs.python.org/3/library/re.html后要比Python 3中的{'18428': 5, '18429': 5} 并不完全等同于\d, 然后, 如果没有匹配项[0-9],请小心,将引发错误 尝试类似

pattern.match

答案 4 :(得分:0)

根据所需的最终字符串格式,可以通过以下两种方法执行此操作:

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

还有其他方式进行位置和切片,但这与您的原始代码最相似。替换|如您所见,将时间和日期划分为两个单独的字符串...