Определите функцию для анализа адреса электронной почты - PullRequest
0 голосов
/ 09 февраля 2019

Мне нужно написать функцию parse_email, которая при наличии адреса электронной почты s возвращает кортеж (идентификатор пользователя, домен), соответствующий имени пользователя и имени домена.Например, учитывая richie@cc.gatech.edu, он должен вернуть (richie, cc.gatech.edu).

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

Я попробовал следующую функцию:

def parse_email (s):
    """Parses a string as an email address, returning an (id, domain) pair."""
    try:
        return(re.match(r'\S([\w\.+_-]+)@([\w\._-]+)',s).groups())
    except:
        pass

Может ли кто-нибудь помочь мне в завершениифункция, в которой, если в начале строки есть пробелы, выдается ошибка.

def parse_email (s):   
    try:    
            return(re.match(r'\S([\w\.+_-]+)@([\w\._-]+)',s).groups())    
    except:    
        pass

Ответы [ 4 ]

0 голосов
/ 09 февраля 2019

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

def parse_email (s):
try:
z = re.fullmatch (r '\ b ([a-zA. -Z]) ([\ W + * * 1005 -] +) @ ([\ ш -.] +) ([A-Za-Z]) \ Ъ», с) .groups ()
return (z [0] + z [1], z [2] + z [3])
кроме AttributeError:
повысить ValueError

0 голосов
/ 09 февраля 2019

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

Создание регулярных выражений для "действительных" адресов электронной почтыэто кошмар, и вы непременно поймете это неправильно.В этой статье объясняется, почему:

https://hackernoon.com/the-100-correct-way-to-validate-email-addresses-7c4818f24643

Ниже приведен некоторый код с тестами, которые показывают, как это работает, но вы не справляетесь с несколькими @ символами.

import pytest

def parse_email(s):
  parts = s.strip().split('@', 1)
  if len(parts) == 2:
    return (parts[0], parts[1])
  else:
    raise ValueError()

def test_parse_simple_email():
  parts = parse_email("cheese@peas.com")
  assert len(parts) == 2
  assert parts[0] == "cheese"
  assert parts[1] == "peas.com"

def test_invalid_email():
  with pytest.raises(ValueError):
    parts = parse_email("this is not an e-mail address")

def test_parse_email_with_whitespace():
  parts = parse_email(" cheese@peas.com ")
  assert len(parts) == 2
  assert parts[0] == "cheese"
  assert parts[1] == "peas.com"
0 голосов
/ 09 февраля 2019

Регулярные выражения здесь совершенно не тот инструмент.Python 3.6+ имеет библиотечную функцию, которая делает именно это.

from email.policy import default as email_default_policy
from email import message_from_string

msg = message_from_string('To: {}'.format(s), policy=email_default_policy)
for addr in msg['to'].addresses:
    yield addr.username, addr.domain

Библиотека email.headerregistry предлагает структурированное представление разобранного адреса электронной почты.Объект email.policy.default необходим для включения функции синтаксического анализа 3.6+ email (хотя документация утверждает, что со временем она станет политикой по умолчанию, и вам больше не нужно будет явно указывать ее).

Демонстрируются парсеры заголовка RFC822 в чистом регулярном выражении.Канонический - это примерно полная страница текста: Mail :: RFC822 :: Address Regex

0 голосов
/ 09 февраля 2019

Разделение можно использовать:

def parse_email (s):   
    try:
        x=re.split('@',s)
        return (x[0],x[1])   
    except:    
        pass

Счастливое кодирование:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...