В версии 0.21 были внесены существенные обновления для переименования столбцов.
rename
добавил параметр axis
, который может быть установлен на columns
или 1
. Это обновление делает этот метод совпадением с остальной частью API pandas. У него все еще есть параметры index
и columns
, но вы больше не вынуждены их использовать. set_axis
с inplace
, установленный на False
, позволяет вам переименовать все метки индекса или столбца со списком. Построить образец 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()
Нет смысла. Даже если вы можете проверить, что адрес электронной почты синтаксически действителен, вам все равно нужно будет проверить, что это не было ошибкой, и что он действительно идет к человеку, которого вы так думаете. Единственный способ сделать это - отправить им электронное письмо и нажать на ссылку для проверки.
Таким образом, самая простая проверка (например, что они случайно не вошли в их адрес) обычно достаточно , Что-то вроде: он имеет ровно один знак @
и по крайней мере один .
в части после @
:
[^@]+@[^@]+\.[^@]+
Вы, вероятно, также захотите запретить пробелы - там вероятно, являются действительными адресами электронной почты с пробелами в них, но я их никогда не видел, поэтому вероятность того, что это ошибка пользователя, на вашей стороне.
Если вам нужна полная проверка, посмотрите этот вопрос .
Обновление: вот как вы могли бы использовать любое такое регулярное выражение:
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
Адреса электронной почты невероятно сложны. Вот пример 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
, но вам нужно решить, нужен ли вам идеальный парсинг или простой код.
import validator
is_valid = validate_email('example@example.com',verify=True)
if (is_valid==True):
return 1
else:
return 0
См. validate_email docs .
Я нашел отличный (и проверенный) способ проверить действительный адрес электронной почты. Я вставляю свой код здесь:
# 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)
проверка подлинности электронной почты
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.'
Стандартная библиотека 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
является синтаксически корректным адресом. Только последний @
следует рассмотреть для обнаружения, где начинается доменная часть.
Поиск идентификатора электронной почты: [/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..
Это обычно решается с помощью регулярного выражения. Однако существует множество вариантов решений. В зависимости от того, насколько строго вы должны быть, и если у вас есть пользовательские требования к валидации или принимаете действительный адрес электронной почты.
См. эту страницу для справки: http://www.regular-expressions.info/email.html
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()
Я не видел ответа уже здесь среди беспорядка пользовательских ответов 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. Каждый из этих токенов проверяется в прилагаемом файле тестового файла.
blockquote>
Для установки с помощью pip
pip install validate_email
, и вам понадобится модуль pyDNS для проверка SMTP-серверов
pip install pyDNS
Адреса электронной почты не так просты, как кажется! Например, 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"
Здесь я вижу много сложных ответов. Некоторые из них, не знают простого, истинного адреса электронной почты или имеют ложные срабатывания. Ниже приведен самый простой способ проверки того, что строка будет действительным адресом электронной почты. Он тестирует 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))
Если вы хотите вытащить почту из длинной строки или файла, попробуйте это.
([^@|\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 из этого строка.
Кроме того, обратите внимание, что это может быть неправильным ответом. Но я разместил его здесь, чтобы помочь кому-то, у кого есть особые требования, такие как я
Вышеупомянутый parseaddr проигнорировал бы конечный @.
from email.utils import parseaddr
parseaddr('aaa@bbb@ccc.com') ('', 'aaa@bbb')
Вероятно вывести адрес и сравнить с оригиналом?
Кто-нибудь пробовал validate.email?
Для проверки использования электронной почты используйте 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")
Единственный действительно точный способ отличить реальные, действительные адреса электронной почты от недействительных - это отправить письмо ему . То, что считается электронной почтой, удивительно запутано ("John Doe" <john.doe@example.com>"
действительно является действительным адресом электронной почты), и вы, скорее всего, хотите, чтобы адрес электронной почты фактически отправил ему письмо позже. После прохождения некоторых основных проверок здравомыслия (например, в ответе Томаса есть @
и по крайней мере один .
после @
), вам, вероятно, следует просто отправить письмо с подтверждением электронной почты на адрес и дождаться чтобы следовать за ссылкой, встроенной в сообщение, чтобы подтвердить, что письмо действительно.