2013-04-23 2 views
0

У меня есть сценарий, который анализирует файлы журналов и в части программирования мне нужно знать, передано или нет сообщение, и, читая эти строки, я могу получить идентификатор сообщения и узнать, сообщение передается или нет.извлечение числа и строки после него

01:09:25.258 mta Messages  I Doc O:NVS:SMTP/[email protected] R:NVS:SMS/+654811 mid:6261 
01:09:41.965 mta Messages  I Rep 6261 OK, Message received(ID: 26) 
08:14:14.469 mta Messages  I Doc O:NVS:SMTP/[email protected] R:NVS:SMS/+654646 mid:6262 
08:14:30.630 mta Messages  I Rep O:NVS:SMTP/[email protected] R:NVS:SMS/+304859 mid:6262 
08:14:30.630 mta Messages  I Rep 6262 Error while transmitting (ID: 28) 

линия я заинтересован в являются вторым и последним, я хотел бы, чтобы извлечь 6261 и КИ после него и то же самое для последней строки

+1

Разделяется ли эта вкладка? Вы сами пытались использовать какой-либо код? Если да, пожалуйста, покажите это. – kojiro

ответ

5

Вам не нужно регулярное выражение. Просто разделите строки на пробелы.

>>> line.split(None, 5) 
['10:56:45.255', 'Message', 'I', 'Rep', '2559', 'OK, Message received'] 

Поскольку вы хотите только идентификатор и сообщение:

>>> [line.split(None, 5)[-2:] for line in file.readlines()] 
[['2548', 'OK'], ['2559', 'OK, Message received'], ['2560', 'Error'], ['2561', 'Transmission... ']] 

Обратите внимание, что пробелы в сообщении не является проблемой.

+1

Пока не появится строка, где 'Message' заменяется на' A Test' или что-то еще с пробелами. Как я уже сказал в своем ответе, мы не можем предоставить полное рабочее решение, не зная формат файла более подробно, чем 4 строки. «I» также может быть необязательным маркером, отсутствующим в других случаях. –

+0

@Niels: 5 является значительным, сообщение может иметь любое количество пробелов, которое он хочет. Мой ответ работает на данный формат. Ваше утверждение о том, что я, возможно, отсутствует, не поддерживается тем, что говорит OP. –

+0

вот обновление моего вопроса, так как вы можете видеть, что после каждого сообщения есть середина, а позже есть ответ с этой серединой и ок или ошибка, и я бы хотел сделать тест, чтобы узнать, передано ли сообщение или нет , .... i allready сделал функцию, которая получает середину и источник и назначение теперь, я просто должен знать, отправлено ли сообщение или нет. –

-1

/[0-9]{4} (.*)/ будет соответствовать цель, но я не знаю, достаточно ли этого для вас. В зависимости от того, может ли быть меньше идентификатор строки (2548 и т. Д.), Регулярное выражение должно быть слегка изменено, но из 4 показанных строк это сработает.

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

Смежные вопросы