Простая проверка формата электронной почты [дубликат]

Pandas 0.21+ Answer

В версии 0.21 были внесены существенные обновления для переименования столбцов.

  • Метод rename добавил параметр axis, который может быть установлен на columns или 1. Это обновление делает этот метод совпадением с остальной частью API pandas. У него все еще есть параметры index и columns, но вы больше не вынуждены их использовать.
  • Метод set_axis с inplace, установленный на False, позволяет вам переименовать все метки индекса или столбца со списком.

Примеры для Pandas 0.21 +

Построить образец DataFrame:

df = pd.DataFrame({'$a':[1,2], '$b': [3,4], 
                   '$c':[5,6], '$d':[7,8], 
                   '$e':[9,10]})

   $a  $b  $c  $d  $e
0   1   3   5   7   9
1   2   4   6   8  10

Используя rename с axis='columns' или axis=1

df.rename({'$a':'a', '$b':'b', '$c':'c', '$d':'d', '$e':'e'}, axis='columns')

или

df.rename({'$a':'a', '$b':'b', '$c':'c', '$d':'d', '$e':'e'}, axis=1)

Оба результата приведут к следующему:

   a  b  c  d   e
0  1  3  5  7   9
1  2  4  6  8  10

По-прежнему можно использовать старую сигнатуру метода:

df.rename(columns={'$a':'a', '$b':'b', '$c':'c', '$d':'d', '$e':'e'})

Функция rename также принимает функции, которые будут применяться к каждому имени столбца.

df.rename(lambda x: x[1:], axis='columns')

или

df.rename(lambda x: x[1:], axis=1)

Используя set_axis со списком и inplace=False

Вы можете предоставить список методу set_axis, равному по длине количеству столбцов (или индекса). В настоящее время inplace по умолчанию True, но inplace по умолчанию будет False в будущих выпусках.

df.set_axis(['a', 'b', 'c', 'd', 'e'], axis='columns', inplace=False)

или

df.set_axis(['a', 'b', 'c', 'd', 'e'], axis=1, inplace=False)

Почему бы не использовать df.columns = ['a', 'b', 'c', 'd', 'e']?

Нет ничего плохого в назначении столбцов прямо так. Это идеальное решение.

Преимущество использования set_axis в том, что его можно использовать как часть цепочки методов и что он возвращает новую копию DataFrame. Без этого вам нужно будет сохранить промежуточные шаги цепочки на другую переменную, прежде чем переназначать столбцы.

# new for pandas 0.21+
df.some_method1()
  .some_method2()
  .set_axis()
  .some_method3()

# old way
df1 = df.some_method1()
        .some_method2()
df1.columns = columns
df1.some_method3()
130
задан user1937198 9 May 2013 в 17:56
поделиться

17 ответов

Нет смысла. Даже если вы можете проверить, что адрес электронной почты синтаксически действителен, вам все равно нужно будет проверить, что это не было ошибкой, и что он действительно идет к человеку, которого вы так думаете. Единственный способ сделать это - отправить им электронное письмо и нажать на ссылку для проверки.

Таким образом, самая простая проверка (например, что они случайно не вошли в их адрес) обычно достаточно , Что-то вроде: он имеет ровно один знак @ и по крайней мере один . в части после @:

[^@]+@[^@]+\.[^@]+

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

Если вам нужна полная проверка, посмотрите этот вопрос .


Обновление: вот как вы могли бы использовать любое такое регулярное выражение:

import re

if not re.match(r"... regex here ...", email):
  # whatever

Обратите внимание на r перед строка; таким образом, вам не нужно будет избегать вещей дважды.

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

import re

EMAIL_REGEX = re.compile(r"... regex here ...")

if not EMAIL_REGEX.match(email):
  # whatever
195
ответ дан Community 25 August 2018 в 20:38
поделиться

Адреса электронной почты невероятно сложны. Вот пример regex, который будет соответствовать каждому действительному адресу RFC822: http://www.ex-parrot.com/pdw/Mail-RFC822-Address.html

что вы, вероятно, дольше, чем остальная часть вашей программы. Для Perl существуют даже целые модули с целью проверки адресов электронной почты. Таким образом, вы, вероятно, не получите ничего, что на 100% лучше, чем регулярное выражение, а также читаемое. Вот пример рекурсивного парсера спуска: http://cpansearch.perl.org/src/ABIGAIL/RFC-RFC822-Address-2009110702/lib/RFC/RFC822/Address.pm

, но вам нужно решить, нужен ли вам идеальный парсинг или простой код.

2
ответ дан Dan 25 August 2018 в 20:38
поделиться
import validator
is_valid = validate_email('example@example.com',verify=True)
if (is_valid==True):
    return 1
else:
    return 0

См. validate_email docs .

0
ответ дан Floern 25 August 2018 в 20:38
поделиться

Я нашел отличный (и проверенный) способ проверить действительный адрес электронной почты. Я вставляю свой код здесь:

# here i import the module that implements regular expressions
import re
# here is my function to check for valid email address
def test_email(your_pattern):
pattern = re.compile(your_pattern)
# here is an example list of email to check it at the end
emails = ["john@example.com", "python-list@python.org", "wha.t.`1an?ug{}ly@email.com"]
for email in emails:
    if not re.match(pattern, email):
        print "You failed to match %s" % (email)
    elif not your_pattern:
        print "Forgot to enter a pattern!"
    else:
        print "Pass"
# my pattern that is passed as argument in my function is here!
pattern = r"\"?([-a-zA-Z0-9.`?{}]+@\w+\.\w+)\"?"   
# here i test my function passing my pattern
test_email(pattern)
3
ответ дан James The Beard 25 August 2018 в 20:38
поделиться

проверка подлинности электронной почты

import re
def validate(email): 
    match=re.search(r"(^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9]+\.[a-zA-Z0-9.]*\.*[com|org|edu]{3}$)",email)
    if match:
        return 'Valid email.'
    else:
        return 'Invalid email.'
-1
ответ дан kouak 25 August 2018 в 20:38
поделиться

Стандартная библиотека Python поставляется с функцией разбора электронной почты: email.utils.parseaddr() .

Возвращает двоичный код, содержащий действительное имя и фактические адреса e-mail:

>>> from email.utils import parseaddr
>>> parseaddr('foo@example.com')
('', 'foo@example.com')

>>> parseaddr('Full Name <full@example.com>')
('Full Name', 'full@example.com')

>>> parseaddr('"Full Name with quotes and <weird@chars.com>" <weird@example.com>')
('Full Name with quotes and <weird@chars.com>', 'weird@example.com')

И если синтаксический анализ не увенчался успехом, он возвращает два кортежа пустых строк:

>>> parseaddr('[invalid!email]')
('', '')

Проблема с этим парсером заключается в том, что это принятие чего-либо, что считается действительным адресом электронной почты для RFC-822 и друзей, включая многие вещи, которые явно не адресуются в широком Интернете:

>>> parseaddr('invalid@example,com') # notice the comma
('', 'invalid@example')

>>> parseaddr('invalid-email')
('', 'invalid-email')

Итак, как @TokenMacGuy положил его , единственный окончательный способ проверки адреса электронной почты - отправить электронное письмо на ожидаемый адрес и дождаться, когда пользователь будет воздействовать на информацию внутри сообщения.

Однако вы можете захотеть проверьте, по крайней мере, наличие @ -знака на втором элементе кортежа, поскольку @bvukelic предлагает:

>>> '@' in parseaddr("invalid-email")[1]
False

Если вы хотите сделать еще один шаг, вы можете установить dnspython и разрешить почтовые серверы для домена электронной почты (часть после «@»), только пытается отправить электронное письмо, если есть настоящие MX серверы:

>>> from dns.resolver import query
>>> domain = 'foo@bar@google.com'.rsplit('@', 1)[-1]
>>> bool(query(domain, 'MX'))
True
>>> query('example.com', 'MX')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  [...]
dns.resolver.NoAnswer
>>> query('not-a-domain', 'MX')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  [...]
dns.resolver.NXDOMAIN

Вы можете поймать оба NoAnswer и NXDOMAIN, поймав dns.exception.DNSException .

И Да, foo@bar@google.com является синтаксически корректным адресом. Только последний @ следует рассмотреть для обнаружения, где начинается доменная часть.

89
ответ дан LeoRochael 25 August 2018 в 20:38
поделиться

Поиск идентификатора электронной почты: finding IP screenshot [/g0]

import re 
a=open("aa.txt","r")
#c=a.readlines() 
b=a.read()
c=b.split("\n")
print(c)
  for d in c: 
    obj=re.search(r'[\w.]+\@[\w.]+',d)
    if obj:
      print(obj.group())  
#for more calcification click on image above..
0
ответ дан Mani 25 August 2018 в 20:38
поделиться

Это обычно решается с помощью регулярного выражения. Однако существует множество вариантов решений. В зависимости от того, насколько строго вы должны быть, и если у вас есть пользовательские требования к валидации или принимаете действительный адрес электронной почты.

См. эту страницу для справки: http://www.regular-expressions.info/email.html

4
ответ дан Mithon 25 August 2018 в 20:38
поделиться
import re
def email():
    email = raw_input("enter the mail address::")
     match = re.search(r'[\w.-]+@[\w.-]+.\w+', email)

    if match:
        print "valid email :::", match.group()
    else:
        print "not valid:::"

email()
1
ответ дан nidhin 25 August 2018 в 20:38
поделиться

Я не видел ответа уже здесь среди беспорядка пользовательских ответов Regex, но ...

Python имеет модуль под названием validate_email , который имеет 3 уровня электронной почты проверка подлинности, в том числе запрос действительного SMTP-сервера, если адрес электронной почты действителен (без отправки электронной почты).

Проверьте правильность формата электронной почты:

from validate_email import validate_email
is_valid = validate_email('example@example.com')

Проверьте, SMTP-сервер:

is_valid = validate_email('example@example.com',check_mx=True)

Проверьте, есть ли у хоста SMTP-сервер и действительно ли это письмо:

is_valid = validate_email('example@example.com',verify=True)

Для тех, кто интересуется грязными деталями, validate_email.py ( source ) стремится быть верным RFC 2822 .

Все, что мы действительно делаем, это сравнение входной строки с одним гигантским регулярным выражением , Но создание этого регулярного выражения и обеспечение его правильности облегчается путем сборки его из «токенов», определенных RFC. Каждый из этих токенов проверяется в прилагаемом файле тестового файла.


Для установки с помощью pip

pip install validate_email

, и вам понадобится модуль pyDNS для проверка SMTP-серверов

pip install pyDNS
33
ответ дан philshem 25 August 2018 в 20:38
поделиться

Адреса электронной почты не так просты, как кажется! Например, Bob_O'Reilly+tag@example.com, является действительным адресом электронной почты.

Мне повезло с пакетом lepl ( http://www.acooke.org/ ЮЛПП / [/ д0]). Он может проверять адреса электронной почты, как указано в RFC 3696: http://www.faqs.org/rfcs/rfc3696.html

Найден какой-то старый код:

import lepl.apps.rfc3696
email_validator = lepl.apps.rfc3696.Email()
if not email_validator("email@example.com"):
    print "Invalid email"
20
ответ дан Prof. Falken 25 August 2018 в 20:38
поделиться

Здесь я вижу много сложных ответов. Некоторые из них, не знают простого, истинного адреса электронной почты или имеют ложные срабатывания. Ниже приведен самый простой способ проверки того, что строка будет действительным адресом электронной почты. Он тестирует 2 и 3 буквы TLD. Теперь, когда вы технически можете иметь более крупные, вы можете увеличить число от 3 до 4, 5 или даже 10.

import re
def valid_email(email):
  return bool(re.search(r"^[\w\.\+\-]+\@[\w]+\.[a-z]{2,3}$", email))
3
ответ дан PyTis 25 August 2018 в 20:38
поделиться

Если вы хотите вытащить почту из длинной строки или файла, попробуйте это.

([^@|\s]+@[^@]+\.[^@|\s]+)

Обратите внимание: это будет работать, если у вас есть место до и после вашего адреса электронной почты. Если у вас нет места или у вас есть специальные символы, вы можете попробовать его изменить.

Рабочий пример:

string="Hello ABCD, here is my mail id example@me.com "
res = re.search("([^@|\s]+@[^@]+\.[^@|\s]+)",string,re.I)
res.group(1)

Это выведет example@me.com из этого строка.

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

1
ответ дан Raj Chinna 25 August 2018 в 20:38
поделиться

Вышеупомянутый parseaddr проигнорировал бы конечный @.

from email.utils import parseaddr
parseaddr('aaa@bbb@ccc.com') ('', 'aaa@bbb')

Вероятно вывести адрес и сравнить с оригиналом?

Кто-нибудь пробовал validate.email?

1
ответ дан Serge 25 August 2018 в 20:38
поделиться

Для проверки использования электронной почты используйте email_validator

from email_validator import validate_email, EmailNotValidError

def check_email(email):
    try:
        v = validate_email(email)  # validate and get info
        email = v["email"]  # replace with normalized form
        print("True")
    except EmailNotValidError as e:
        # email is not valid, exception message is human-readable
        print(str(e))

check_email("test@gmailcom")
0
ответ дан Simo Erkinheimo 25 August 2018 в 20:38
поделиться

Единственный действительно точный способ отличить реальные, действительные адреса электронной почты от недействительных - это отправить письмо ему . То, что считается электронной почтой, удивительно запутано ("John Doe" <john.doe@example.com>" действительно является действительным адресом электронной почты), и вы, скорее всего, хотите, чтобы адрес электронной почты фактически отправил ему письмо позже. После прохождения некоторых основных проверок здравомыслия (например, в ответе Томаса есть @ и по крайней мере один . после @), вам, вероятно, следует просто отправить письмо с подтверждением электронной почты на адрес и дождаться чтобы следовать за ссылкой, встроенной в сообщение, чтобы подтвердить, что письмо действительно.

-2
ответ дан SingleNegationElimination 25 August 2018 в 20:38
поделиться
"^[\w\.\+\-]+\@[\w]+\.[a-z]{2,3}$"
-1
ответ дан Taryn 25 August 2018 в 20:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: