Python 从日志文件中提取日期?

Python 从日志文件中提取日期?,python,datetime,Python,Datetime,我正在尝试从日志文件示例字符串创建DateTime对象 我一直在尝试使用正则表达式来解析它,但每当我使用日志文件的格式时,它就失败了,在后半段的时间里,日志文件中有一个串联字母“T”。我的测试字符串是“错误2019-02-03T23:21:20找不到文件” def convert_to_datetime(行): match=re.search('\d{4}-\d{2}-\d{2}',行) 我正努力从字符串中找出完整的日期。我尝试了几个正则表达式,但我认为我使用了错误的语法。您也需要打印匹配的组

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

我一直在尝试使用正则表达式来解析它,但每当我使用日志文件的格式时,它就失败了,在后半段的时间里,日志文件中有一个串联字母“T”。我的测试字符串是“错误2019-02-03T23:21:20找不到文件”

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

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

您也需要打印匹配的组

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
另外,如果您想获得整个datetime字符串,您可以这样做

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对象,可以使用库


你的结束。您只需获得以下结果:

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
输出:

t = convert_to_datetime('ERROR 2019-02-03T23:21:20 cannot find file')
print(t)
2019-02-03
首先,阅读后要小心,Python 3中的
\d
并不完全等同于
[0-9]
, 那么, 如果没有匹配的
模式,请小心。匹配将引发错误
试试像这样的东西

pattern=re.compile('[0-9]{4}-[0-9]{2}-[0-9]{2}')
如果模式。搜索(行):
匹配。追加(模式。搜索(行))
...

不确定是否需要,但如果字符串是自由样式,则从字符串生成日期时间对象可能非常复杂。但我们有一揽子计划可以帮助:

>>> 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)

根据最终字符串的格式,有两种方法可以实现这一点:

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

位置和切片还有其他方法,但这与原始代码最为相似。根据需要替换|或将时间和日期分成两个单独的字符串

打印(match.group(),如果匹配,否则为“不匹配”)
match
之后,如果答案对您有帮助,那太好了!请投赞成票并接受它:)我从未注意到这一点。我们需要研究错误处理,感谢您指出@sslloo