我正在尝试从日志文件示例字符串创建DateTime对象。
我一直在尝试使用正则表达式来解析此内容,但是每当下半时使用连接字母'T'的日志文件格式时,它都会失败。我的测试字符串是“错误2019-02-03T23:21:20找不到文件”
def convert_to_datetime(line):
match = re.search('\d{4}-\d{2}-\d{2}', line)
我正在努力从字符串中获取完整的日期。我尝试了几种正则表达式,但我认为我使用了错误的语法。
答案 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
还有其他方式进行位置和切片,但这与您的原始代码最相似。替换|如您所见,将时间和日期划分为两个单独的字符串...