我有一个日志文件,其中包含1,770,781行格式
[02/Jan/2015:08:08:43] "GET /click?article_id=139&user_id=19550 HTTP/1.1" 200 3078
我希望提取时间,article_id和user_id,并以方便的格式将它们组合起来进行分析。现在,我有以下代码提取这些元素并尝试将它们组合在Pandas DataFrame中:
logs = pd.DataFrame(columns=['time', 'article_id', 'user_id'])
regex = '\[(?P<time>.*?)\] "GET (.*?=)(?P<article_id>\d+)(&.*?=)(?P<user_id>\d+)'
for line in log_file:
time = re.match(regex, line).group('time')
article_id = re.match(regex, line).group('article_id')
user_id = re.match(regex, line).group('user_id')
logs.append([time, article_id, user_id])
但这需要永远运行,我开始认为我应该放弃这种方法。有没有办法让这个更有效率?尝试这样做是否真实可行?如果没有,是否有更好的方法来获取这些数据?
答案 0 :(得分:2)
你没有使用re.compile
,而且当你在循环中一次足够的时候,你也没有效率地匹配三次。
logs = pd.DataFrame(columns=['time', 'article_id', 'user_id'])
# regc = re.compile(r'\[(?P<time>.*?)\] "GET (.*?=)(?P<article_id>\d+)(&.*?=)(?P<user_id>\d+)')
# alternative regexp that might be more efficient
regc = re.compile(r'\[(?P<time>.+)\] "GET (?:.+article_id=)(?P<article_id>\d+)(?:&user_id=)(?P<user_id>\d+)')
for line in log_file:
m = regc.match(line)
time = m.group('time')
article_id = m.group('article_id')
user_id = m.group('user_id')
logs.append([time, article_id, user_id])