2014-01-30 3 views
2

Я работаю над скриптом Python, чтобы добавить в базу данных некоторые журналы IRC (формат energymech); Для этого мне нужно разбить строки на свои части (временная метка, пользователь, сообщение).Python regex не соответствует полной группе захвата

Я использую следующее регулярное выражение, чтобы получить строки текста, которые соответствуют:

normalline = re.compile('^\[[^\]]*(\d{2}):\d+:\d+\] <([^>]+)> (.*)$')

Проблема заключается в том, что он не правильно назначать первую группу захвата (он только возвращает первые 2 символы в группе).

Строка текста я тестирую его против [20:33:02] <user> random message here

Сценарий я использую для тестирования заключается в следующем:

import re 
normalline = re.compile('^\[[^\]]*(\d{2}):\d+:\d+\] <([^>]+)> (.*)$') 
print normalline.search('[20:33:02] <user> random message here').groups() 

В результате я получаю ('20', 'user', 'random message here') вместо ('20:33:02', 'user', 'random message here')

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

+2

Что-то с вашей первой группой '^ \ [[^ \]] * (\ d {2}: \ d +: \ d +) \] <([^>] +)> (. *) $ '. – HamZa

ответ

3

Похоже, вам нужно всего лишь изменить первую группу захвата, чтобы инкапсулировать все три числа:

^\[[^\]]*(\d{2}:\d+:\d+)\] <([^>]+)> (.*)$ 

Совпадение:

('20:33:02', 'user', 'random message here') 

Вы также можете захотеть ограничить второй и третий номер до двух цифр, например, у вас есть для первого номера:

^\[[^\]]*(\d{2}:\d{2}:\d{2})\] <([^>]+)> (.*)$ 
Смежные вопросы