2013-04-23 2 views
3

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


вот пример линий:

data = "09:55:04.125 mta   Messages  I Doc O:SERVER (NVS:SMTP/[email protected]) R:NVS:FAXG3.I0.0101 mid:6393" 
data2= "09:55:05.045 mta   Messages  I Doc O:SERVER (NVS:SMTP/[email protected]) R:ADMIN (NVS:SMTP.0/[email protected]) mid:6397" 

на первый я сопрягали что между слэшем и двумя точками, но я заметил, что есть некоторые линии, как первый, где тип «FAXG3. I0.0101 "не следует косой чертой


вот регулярное выражение я использую:

exp = result = re.findall(r'[\w\.]+(?=:*)',data) # type S & D 

результат я хочу 'SMTP', 'FAXG3.I0.0101' для первой строки и 'SMTP', 'SMTP .0 'для второго. Может кто-то помочь в исправлении моего регулярного выражения, чтобы получить это?

+0

Кажется, ваше регулярное выражение не совсем соответствует названию вашего вопроса. Вы проверяете, есть ли 0 или более ':' ** после ** вашего совпадения, а не раньше ... – Loamhoof

ответ

3

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

import re 
data = "This is a test message I Res O:Myself (KTP:SMTP/[email protected]) R:KTP:SMS.CLASS/+345854595 id:21" 
result = re.findall(r'[\w\.]+(?=:*/)',data) 
print result 

['SMTP', 'SMS.CLASS'] 

[\w\.]+ говорит, что вы будете принимать последовательность, состоящую по меньшей мере, один «любой алфавитно-цифровой символ и символ подчеркивания» (\w) или . (\. - он должен быть экранирован, иначе . означает «любой символ»).

+0

благодарим вас за ответ и объяснение =) –

1

Это должно работать:

result = re.findall(r'(?<=:)[\w.]+(?=/)',data) 

Высказывание "последовательность алфавитно-цифровых символов (или знак подчеркивания или точка) между : и /".

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