2013-04-18 4 views
0

Вот мой код: У меня есть скрипт, который читает файл, но в моем файле не все строки похожи, и я хотел бы извлекать информацию только из строк, которые есть I DOC O:.Только строки, содержащие определенную строку и применяющие к ним regex

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

#!/usr/bin/env python 

# -*- coding: utf-8 -*- 

import re 

def extraire(data): 
    ms = re.match(r'(\S+).*?(O:\S+).*(R:\S+).*mid:(\d+)', data) # heure & mid 
    return {'Heure':ms.group(1), 'mid':ms.group(2),"Origine":ms.group(3),"Destination":ms.group(4)} 

tableau = [] 

fichier = open("/home/TEST/file.log") 
f = fichier.readlines() 
for line in f: 
    if (re.findall(".*I Doc O:.*",line)):  
    tableau = [extraire(line) for line in f ] 

print tableau 
fichier.close() 

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

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 O:NVS:SMTP/[email protected] R:NVS:SMS/+455451 mid:6261 
01:09:41.965 mta   Messages  I Rep 6261 OK, Accepted (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/+33688704859 mid:6262 
08:14:30.630 mta   Messages  I Rep 6262 OK, Accepted (ID: 28) 
+0

добавить '?' после вашего первого. * – pyInTheSky

+0

Вы смешали TAB и SPACE в отступе в своем посте. Можете ли вы исправить отступы в своем сообщении, чтобы мы могли устранить эту проблему? –

ответ

0

От: http://docs.python.org/2/library/re.html

, + ?, ?? '', '+' и '?' квалификаторы все жадные; они соответствуют как можно большему количеству текста. Иногда такое поведение нежелательно; если RE <. *> сопоставлено с ...

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

buff = fichier.read() 
matches = re.findall(".*?I Doc):.*", buff) 
for match in matches: 
    tableau = ... 

-Это мой тестовый код, не могли бы вы рассказать мне, что он делает, чего вы не хотели?

>>> import re 
>>> a = """ 
... 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 O:NVS:SMTP/[email protected] R:NVS:SMS/+455451 mid:6261 
... 01:09:41.965 mta   Messages  I Rep 6261 OK, Accepted (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/+33688704859 mid:6262 
... 08:14:30.630 mta   Messages  I Rep 6262 OK, Accepted (ID: 28)""" 
>>> m = re.findall(".*?I Doc O:.*",a) 
['01:09:25.258 mta   Messages  I Doc O:NVS:SMTP/[email protected] R:NVS:SMS/+654811 mid:6261', '08:14:14.469 mta   Messages  I Doc O:NVS:SMTP/[email protected] R:NVS:SMS/+654646 mid:6262'] 

>>> tableau = [] 
>>> for line in m: 
...  tableau.append(extraire(line)) 
... 
>>> tableau 
[{'Origine': 'R:NVS:SMS/+654811', 'Destination': '6261', 'Heure': '01:09:25.258', 'mid': 'O:NVS:SMTP/[email protected]'}, {'Origine': 'R:NVS:SMS/+654646', 'Destination': '6262', 'Heure': '08:14:14.469', 'mid': 'O:NVS:SMTP/[email protected]'}] 

вы также можете сделать это в одной строке, как

>>> tableau = [ extraire(line) for line in re.findall(".*?I Doc):.*", fichier.read()) ] 
+0

это не работает ваше решение ...:/ –

+0

Я не уверен, что не работает для вас, но, к моему ответу, я добавил полный рабочий код, так что надеюсь, что теперь помогает – pyInTheSky

+0

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

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