Как искать строковые члены списка в другой строке в Python 2 - PullRequest
0 голосов
/ 15 марта 2012

У меня есть строка, скажем, адрес электронной почты От:

str1 = "Name <emailaddress@example.com>"

(или, возможно, в другом формате, дело в том, что внутри str адрес электронной почты найден ...)

И у меня есть список адресов:

lst = ["email1@example.com", "email2@yahoo.com", "email3@mail.com", "emailaddress@example.com"]

Какой самый питонский способ поиска, если часть str с адресом электронной почты является одним из членов на lst?

В этом примере часть электронной почты str1 является частью lst, но для:

str2 = "Another email emailexample@domain.com"

это не ...

Кроме того,

str3 = "Example email1@example.com"

будет соответствовать, потому что email1@example.com находится в списке, независимо от того, что нет <<'>> вокруг адресов электронной почты ...

Ответы [ 3 ]

2 голосов
/ 15 марта 2012

Обычно регулярные выражения не считаются pythonic, но это, кажется, задача, сделанная именно для них.

Поэтому я бы использовал их, извлеки адрес электронной почты и проверил, если in список:

>>> re.search(r'<(.*)>', "Name <emailaddress@example.com>").group(1) in lst
True

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

Edit: Еслиформат вашего поля не является стандартным, нет проблем: вам просто нужно лучшее регулярное выражение, которое будет соответствовать электронной почте.(Я уверен, что есть множество примеров, я не собираюсь гуглить это для вас).

Но это не значит, что вы не должны использовать регулярные выражения для такого рода задач.

2 голосов
/ 15 марта 2012

из http://love -python.blogspot.com / 2008/04 / python-code-to-scrape-email-address.html

>>> email_pattern = re.compile("[-a-zA-Z0-9._]+@[-a-zA-Z0-9_]+.[a-zA-Z0-9_.]+")
>>> str = "Name <emailaddress@example.com>"
>>> str2 = "Another email emailexample@domain.com"
>>> lst = ["email1@example.com", "email2@yahoo.com", "email3@mail.com", "emailaddress@example.com"]
>>> import re
>>> set(re.findall(email_pattern, str)).intersection(lst)
set(['emailaddress@example.com'])
>>> set(re.findall(email_pattern, str2)).intersection(lst)
set([])
1 голос
/ 15 марта 2012

Я не знаю, питон ли это:

return str1.split('<')[1].split('>')[0] in lst
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...