Я пытаюсь использовать регулярное выражение для извлечения части адреса электронной почты между знаком "@" и знаком "." персонаж. Вот как я сейчас это делаю, но не могу получить правильные результаты.

company = re.findall('^From:.+@(.*).',line)

Дает мне:

['@iupui.edu']

Я хочу избавиться от .edu

2
MAS 16 Дек 2015 в 14:24

4 ответа

Лучший ответ

Чтобы соответствовать литералу . в вашем регулярном выражении, вам нужно использовать \., поэтому ваш код должен выглядеть следующим образом:

company = re.findall('^From:.+@(.*)\.',line)
#                                  ^ this position was wrong

Смотрите его здесь.

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

company = re.findall('^From:.+@([^\.]*)\.',line)

Regular expression visualization

Смотрите демонстрационную версию.

3
Alex 16 Дек 2015 в 14:03

Вы можете попробовать это:

(?<=\@)(.*?)(?=\.)

Смотрите демонстрационную версию.

3
Alex 16 Дек 2015 в 11:30

Вы можете просто разделить и найти:

s = " abc.def@ghi.mn I"
s = s.split("@", 1)[-1]
print(s[:s.find(".")])

Или просто разделить, если он не всегда соответствует вашей строке:

s = s.split("@", 1)[-1].split(".", 1)[0]

Если это так, то поиск будет самым быстрым:

i = s.find("@")
s = s[i+1:s.find(".", i)]
1
Padraic Cunningham 16 Дек 2015 в 12:00

Простой пример:

>>> import re
>>> re.findall(".*(?<=\@)(.*?)(?=\.)", "From: atc@moo.com")
['moo']
>>> re.findall(".*(?<=\@)(.*?)(?=\.)", "From: atc@moo-hihihi.com")
['moo-hihihi']

Это соответствует имени хоста независимо от начала строки, то есть это жадный .

2
Alex 16 Дек 2015 в 14:03