Проблема разделения разделителя Python

Несколько месяцев назад я написал небольшой скрипт на Python, который собирает базовую статистику из логов моих приманок. Я обнаружил, что в этом скрипте есть ошибка, и я не смог найти ответ самостоятельно.

Скрипт будет читать лог-файлы атак. Файлы журнала содержат пять частей данных в каждой строке.

  • отметка даты/времени
  • IP-адрес, с которого произошла атака
  • попытка имени пользователя
  • попытка ввода пароля
  • код успеха/неудачи


Пример:

2014-12-24 13:37:00,1.2.3.4,root,password,0    

Пять фрагментов данных разделены символом ','.
Поэтому я использовал ',' в качестве разделителя, чтобы разделить строки на список, как здесь.

['2014-12-24 13:37:00', '1.2.3.4', 'root', 'password', '0']    

из которого я могу получить данные, которые мне нужны.

Проблема, с которой, я уверен, некоторые из вас уже разобрались,
возникает, когда в попытке ввести пароль присутствует разделитель,
в данном случае H4ck3r,,h4cker,,,2015

Файл журнала выглядит следующим образом

2015-01-02 01:44:38,2.3.4.5,root,H4ck3r,,h4cker,,2015,0    

и превращает полученный список в этот после того, как он был slpit.

['2015-01-02 01:44:38', '2.3.4.5', 'root', 'H4ck3r', '', 'h4cker', '', '2015', '0']    


Моей первой мыслью об обходном пути здесь было удалить [0:3] и [-1],
затем принять то, что осталось, в качестве пароля, но,
не очень чисто и точно, чтобы сказать минимум.
Если злоумышленник использует разделитель в имени пользователя, я вернусь к исходной точке.

Вопросы.

  • Есть ли простой и понятный способ решить эту проблему с помощью разделения?
  • Будет ли регулярное выражение лучшим способом пойти сюда?
  • ...Другие способы решить эту проблему?

person Bifrozt    schedule 06.01.2015    source источник
comment
Я думаю, что самым чистым решением было бы записать файл журнала, используя csv.Writer, а затем прочитать его, используя csv.Reader - комбинация Writer/Reader должна обрабатывать поля кавычек/некавычек для вас.   -  person mgilson    schedule 07.01.2015
comment
Возможно, это была хорошая идея. К сожалению, я не тот, кто написал для этого функцию ведения журнала, спасибо за совет.   -  person Bifrozt    schedule 07.01.2015


Ответы (1)


Как уже указывал мгилсон, вы должны изменить формат файлов журнала (если это возможно).

Чтобы проанализировать существующие журналы, вы можете использовать регулярное выражение ^([^,]*),([^,]*),([^,]*),(.*),(\d+)\s*$. Это фиксирует отметку времени в группе 1, IP-адрес в группе 2 и так далее.

демонстрационная версия regex101.

>>> pattern= r'^([^,]*),([^,]*),([^,]*),(.*),(\d+)\s*$'
>>> string= 'time,ip,user,H4ck3r,,h4cker,,2015 ,1'
>>> match= re.match(pattern, string)
>>> print match.groups()
('time', 'ip', 'user', 'H4ck3r,,h4cker,,2015 ', '1')
person Aran-Fey    schedule 07.01.2015
comment
Потрясающий ответ! Я новичок в регулярных выражениях, но ваш ответ и регулярное выражение101 помогут мне с этой проблемой и будущими. Спасибо за это! :) - person Bifrozt; 07.01.2015