2015-10-17 3 views
1

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

From [email protected] Sat Jan 5 09:14:16 2008 
This is a test email. 
From [email protected] 
random text. 
From [email protected] 
From [email protected] Sat Jan 6 03:14:16 2008 
From [email protected] 

и так далее ..... У меня есть задача извлечения всех адресов электронной почты субъектов, которые начинаются с «С» и имеют дату и время в них. Это просто в приведенном выше случае, где я могу игнорировать строки, которые не начинаются с «От», и это не заканчивается «2008». Мой код для этого ниже.

fh = open(fname) 
for line in fh: 
    line = line.rstrip() 
    if not line.startswith('From'): continue 
    if not line.endswith('2008'): continue 
    words = line.split() 
    print words[1] 

Мой вопрос в том, что если темы электронной почты заканчиваются разными случайными годами. В этом случае я больше не могу использовать if not line.endswith('2008'): continue. Может ли кто-нибудь сказать мне, что тогда будет логикой. Спасибо

ответ

0

Вы можете использовать регулярное выражение для проверки (вместо строки: if not line.endswith ('2008'): continue).

year = re.search(r'\d{4}$', line) 

if year is not None: 
    continue 
0

Для более сложного синтаксического анализа вы должны использовать пакет Python регулярных выражений, re. Это гораздо более мощный (хотя и не всегда ясно ..)

Специально для вашего вопроса, вы можете использовать что-то вроде этого:

import re 

fh = open(fname) 
for line in fh: 
    result = re.search(r'^From .* \d{4}$', line) 
    if result is not None: 
     words = line.split() 
     print words[1] 

^From - соответствует всем строкам, которые начинаются с «С». \d{4}$ - соответствует всем строкам, заканчивающимся на 4 десятичных знака. .* - соответствует любым символам между ними.