Не спится мне, решил подчистить предыдущий вариант.
# coding: utf-8
import re
import timeit
log = '''
[16:16:16] <DKф555> ты веришь?
[16:16:18] <DKф555> я нет
[16:22:02] <Yaga> всем привет
[16:22:27] <DKф555> Yaga: привет привет
[16:23:08] <Yaga> DKф555: аг ага
[16:28:42] <Nickel> как тут настрой боевой?
[16:29:04] <Yaga> Nickel: а то!
[16:31:50] <Nickel> )))
[16:36:36] <Yaga> Nickel: :чифир:
[16:48:26] <DKф555> забанить и все тут
[16:57:21] <Nickel> меня тока ненадо
[16:57:25] <Nickel> ок?
[16:59:46] <Nickel> а то я все маме расскажу
[17:06:42] <DKф555> коньяк гони тоды не трону
[17:08:29] <Nickel> блин у меня уже вторй процесс пошол и доспевает еще 4 дня)
[18:48:27] <Nickel> кто тут баралей?
[18:57:47] <Nickel> ,fhбармалей имел ввиду
[19:42:36] <Nickel> так и не появился бармалей?
[19:42:39] <Nickel> )
[19:45:09] <Nickel> всем пока! Труд кормит, лень портит.
[19:45:59] <ртс> счастливо, с приятным аппетитом...
'''
def main(log):
stats = {}
msg_pattern = '(<.*>)(.*)'
for msg in re.finditer(msg_pattern, log):
user = msg.group(1)[1:-1]
msg_body = msg.group(2)
chars_count = len(msg_body)
words_count = len(msg_body.split())
user_present = user in stats
stats[user] = {
'messages': stats[user]['messages'] + 1 if user_present else 1,
'chars': stats[user]['chars']+chars_count if user_present else chars_count,
'words': stats[user]['words']+words_count if user_present else words_count,
'words_per_msg': stats[user]['words']/stats[user]['messages'] if user_present else 0,
'chars_per_msg': stats[user]['chars']/stats[user]['messages'] if user_present else 0,
}
return stats
if __name__ == '__main__':
print(timeit.timeit("main(log)", setup="from __main__ import main,log", number=10000))
print(main(log))