Если ваша цель на самом деле извлечь адреса электронной почты из текста, вы должны использовать библиотеку, созданную для этой цели. Регулярные выражения плохо подходят для сопоставления произвольных адресов электронной почты.
Но если вы делаете это как упражнение для лучшего понимания регулярных выражений, я бы воспользовался подходом расширения используемого вами выражения, чтобы включить дополнительный текст, который вы хотите сопоставить. Итак, сначала позвольте мне объяснить, что делает это регулярное выражение:
[\w\-][\w\-\.]+@[\w\-][\w\-\.]+[a-zA-Z]{1,4}
[\w\-]
соответствует любому «словесному» символу (букве, цифре или подчеркиванию), или дефису
[\w\-\.]+
совпадений (любой символ слова или дефис или точка) один или несколько раз
@
соответствует буквальному '@'
[\w\-]
соответствует любому символу слова или дефис
[\w\-\.]+
совпадений (любой символ слова или дефис или точка) один или несколько раз
[a-zA-Z]{1,4}
соответствует 1, 2, 3 или 4 строчным или прописным буквам
Таким образом, это соответствует последовательности «слова», которая может содержать дефисы или точки, но не начинается с точки, за которой следует знак @
, за которым следует другое «слово» (в том же смысле, что и раньше), которое заканчивается с буквой.
Теперь, чтобы изменить это для ваших целей, давайте добавим части регулярного выражения, чтобы они соответствовали «От», имени и угловым скобкам:
From: [\w\s]+?<([\w\-][\w\-\.]+@[\w\-][\w\-\.]+[a-zA-Z]{1,4})>
From:
соответствует буквальному тексту "From:"
[\w\s]+?
соответствует одному или нескольким последовательным символам слова или пробелам. Знак вопроса делает сопоставление нежадным, поэтому оно будет соответствовать как можно меньшему количеству символов, в то же время позволяя сопоставлять все регулярное выражение (в этом случае, вероятно, это не является необходимым, но оно делает сопоставление более эффективным, поскольку приходит сразу после этого не является символом слова или пробела).
<
соответствует буквальному знаку «меньше» (открывающая угловая скобка)
- То же регулярное выражение, которое вы имели раньше, теперь заключено в скобки. Это делает группу захвата , поэтому вы можете позвонить
m.group(1)
, чтобы получить текст, соответствующий этой части регулярного выражения.
>
соответствует буквальному значению больше, чем
Поскольку регулярное выражение теперь использует группы захвата, ваш код также должен немного измениться:
import re
foundemail = []
mailsrch = re.compile(r'From: [\w\s]+?<([\w\-][\w\-\.]+@[\w\-][\w\-\.]+[a-zA-Z]{1,4})>')
for line in open("text.txt"):
foundemail.extend([m.group(1) for m in mailsrch.finditer(line)])
print foundemail
Код [m.group(1) for m in mailsrch.finditer(line)]
создает список из первой группы захвата (помните, это была часть в скобках) из каждого совпадения, найденного регулярным выражением.