python:使用正则表达式从日志文件中读取日期时间
我有一个日志文件,其文本看起来像这样。python:使用正则表达式从日志文件中读取日期时间
Jul 1 03:27:12 syslog: [m_java][ 1/Jul/2013 03:27:12.818][j:[SessionThread <]^Iat com/avc/abc/magr/service/find.something(abc/1235/locator/abc;Ljava/lang/String;)Labc/abc/abcd/abcd;(bytecode:7)
该文件中有两种时间格式。我需要根据[]中的日期时间格式对此日志文件进行排序。
这是我正在尝试使用的正则表达式。但它不会返回任何东西。
t_pat = re.compile(r".*\[\d+/\D+/.*\]")
我想去过每一行的文件,能够应用这种模式,并根据日期&时间线排序。
有人可以帮助我吗?谢谢!
你不符合最初的空间;你也想组,便于提取的日期,并限制\D
和.*
模式,以非贪婪:
t_pat = re.compile(r".*\[\s?(\d+/\D+?/.*?)\]")
演示:
>>> re.compile(r".*\[\s?(\d+/\D+?/.*?)\]").search(line).group(1)
'1/Jul/2013 03:27:12.818'
可以缩小模式的更多一些;你只需要符合3个字母月例如:
t_pat = re.compile(r".*\[\s?(\d{1,2}/[A-Z][a-z]{2}/\d{4} \d{2}:\d{2}:[\d.]{2,})\]")
我也认为你需要使最后一个量词lazy:\ [\ s?\ d +/\ D + /。*?\] – Ronnie
你在那里,需要添加到正则表达式
text = "Jul 1 03:27:12 syslog: [m_java][ 1/Jul/2013 03:27:12.818][j:[SessionThread <]^Iat com/avc/abc/magr/service/find.something(abc/1235/locator/abc;Ljava/lang/String;)Labc/abc/abcd/abcd;(bytecode:7)"
matches = re.findall(r"\[\s*(\d+/\D+/.*?)\]", text)
print matches
['1/Jul/2013 03:27:12.818']
下一页空间使用下面的函数解析时间
http://docs.python.org/2/library/time.html#time.strptime
最后用这个作为重点成字典和行作为值,并根据密钥对这些条目进行排序。
回答需要更多详细信息 –
添加更多详细信息。 :) – beiller
Read all the lines of the file和使用sort
功能和函数传递parses out the date,并将其用作the key for sorting:
import re
import datetime
def parse_date_from_log_line(line):
t_pat = re.compile(r".*\[\s?(\d+/\D+?/.*?)\]")
date_string = t_pat.search(line).group(1)
format = '%d/%b/%Y %H:%M:%S.%f'
return datetime.datetime.strptime(date_string, format)
log_path = 'mylog.txt'
with open(log_path) as log_file:
lines = log_file.readlines()
lines.sort(key=parse_date_from_log_line)
我得到以下错误:date_string = t_pat.search(line).group(1 ) AttributeError:'NoneType'对象没有属性'group' –
@SupriyaK这是假设行不是无,在代码中没有错误检查,如果有它将不得不处理None情况并且如果没有日期时间需要决定是否跳过它。 –
会不会反而easer在行首使用日期和时间? – Ronnie
'['和'1'之间是否有空格? –
[]内的时间以秒为单位更精确。我确实在一秒钟内获得了很多日志,需要进行排序。 –