Gibt es eine gute Möglichkeit, eine Formulareingabe mit Regex zu überprüfen, um sicherzustellen, dass es sich um eine E-Mail-Adresse handelt, die den richtigen Stil hat? Seit gestern Abend gesucht und jeder, der die Fragen der Benutzer zu diesem Thema beantwortet hat, scheint auch Probleme damit zu haben, wenn es sich um eine untergeordnete E-Mail-Adresse handelt.
Es hat keinen Sinn. Selbst wenn Sie überprüfen können, ob die E-Mail-Adresse syntaktisch gültig ist, müssen Sie trotzdem überprüfen, dass sie nicht falsch geschrieben wurde und tatsächlich an die Person geht, von der Sie glauben, dass sie dies tut. Die einzige Möglichkeit, dies zu tun, besteht darin, ihnen eine E-Mail zu senden und sie auf einen zu bestätigenden Link klicken zu lassen.
Daher ist eine grundlegende Überprüfung (z. B., dass die Adresse nicht versehentlich nicht eingegeben wurde) normalerweise ausreichend. Etwas wie: Es hat genau ein @
-Zeichen und mindestens einen .
im Teil nach dem @
:
[^@][email protected][^@]+\.[^@]+
Wahrscheinlich möchten Sie auch Whitespace nicht zulassen - wahrscheinlich gibt es gültige E-Mail-Adressen mit Whitespace, aber ich habe noch nie eine davon gesehen. Die Wahrscheinlichkeit, dass dies ein Benutzerfehler ist, liegt auf Ihrer Seite.
Wenn Sie die vollständige Überprüfung durchführen möchten, schauen Sie sich diese Frage an.
Update: So können Sie solche Regex verwenden:
import re
if not re.match(r"... regex here ...", email):
# whatever
Beachten Sie die r
vor dem String. Auf diese Weise müssen Sie den Dingen nicht zweimal entkommen.
Wenn Sie eine große Anzahl von Regexen überprüfen müssen, ist es möglicherweise schneller, den Regex zuerst zu kompilieren:
import re
EMAIL_REGEX = re.compile(r"... regex here ...")
if not EMAIL_REGEX.match(email):
# whatever
Eine andere Option ist die Verwendung des Pakets validate_email
, das den SMTP-Server tatsächlich kontaktiert, um zu überprüfen, ob die Adresse vorhanden ist. Dies garantiert jedoch noch nicht, dass es der richtigen Person gehört.
Die Python-Standardbibliothek enthält eine E-Mail-Parsing-Funktion: email.utils.parseaddr()
.
Es wird ein Tupel zurückgegeben, der den tatsächlichen Namen und die tatsächlichen Adressbestandteile der E-Mail enthält:
>>> from email.utils import parseaddr
>>> parseaddr('[email protected]')
('', '[email protected]')
>>> parseaddr('Full Name <[email protected]>')
('Full Name', '[email protected]')
>>> parseaddr('"Full Name with quotes and <[email protected]>" <[email protected]>')
('Full Name with quotes and <[email protected]>', '[email protected]')
Wenn das Parsen nicht erfolgreich ist, wird ein zwei-Tuple leerer Zeichenfolgen zurückgegeben:
>>> parseaddr('[invalid!email]')
('', '')
Ein Problem bei diesem Parser ist, dass er alles akzeptiert, was als gültige E-Mail-Adresse für RFC-822 und Freunde gilt, einschließlich vieler Dinge, die im breiten Internet eindeutig nicht adressierbar sind:
>>> parseaddr('[email protected],com') # notice the comma
('', '[email protected]')
>>> parseaddr('invalid-email')
('', 'invalid-email')
Wie @TokenMacGuy es formuliert, besteht der einzige endgültige Weg zum Überprüfen einer E-Mail-Adresse darin, eine E-Mail an die erwartete Adresse zu senden und darauf zu warten, dass der Benutzer die Informationen in der Nachricht verarbeitet.
Sie sollten jedoch zumindest nach dem Vorhandensein eines @ -Zeichen auf dem zweiten Tuple-Element suchen, wie @bvukelic vorschlägt:
>>> '@' in parseaddr("invalid-email")[1]
False
Wenn Sie einen Schritt weiter gehen möchten, können Sie das dnspython project installieren und die Mail-Server für die E-Mail-Domäne (den Teil nach dem "@") auflösen, wobei nur versucht wird, eine E-Mail zu senden, wenn diese vorhanden ist sind MX
Server:
>>> from dns.resolver import query
>>> domain = '[email protected]@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
Sie können sowohl NoAnswer
als auch NXDOMAIN
abfangen, indem Sie dns.exception.DNSException
abfangen.
Und ja, [email protected]@google.com
ist eine syntaktisch gültige Adresse. Es sollte nur der letzte @
berücksichtigt werden, um herauszufinden, wo der Domain-Teil beginnt.
Ich habe die Antwort hier nicht schon im Chaos der benutzerdefinierten Regex-Antworten gesehen, aber ...
Python verfügt über ein Modul mit dem Namen validate_email, das drei Gültigkeitsstufen für die E-Mail-Gültigkeit hat, einschließlich der Abfrage eines gültigen SMTP-Servers, wenn die E-Mail-Adresse gültig ist (ohne eine E-Mail zu senden).
Überprüfen Sie, ob die E-Mail-Zeichenfolge ein gültiges Format hat:
from validate_email import validate_email
is_valid = validate_email('[email protected]')
Überprüfen Sie, ob der Host über einen SMTP-Server verfügt:
is_valid = validate_email('[email protected]',check_mx=True)
Prüfen Sie, ob der Host über einen SMTP-Server verfügt und die E-Mail wirklich vorhanden ist:
is_valid = validate_email('[email protected]',verify=True)
Für diejenigen, die an den schmutzigen Details interessiert sind, zielt validate_email.py ( source ) darauf ab, RFC 2822 treu zu sein.
Alles, was wir wirklich tun, ist, die Eingabezeichenfolge mit einer .__ zu vergleichen. gigantischer regulärer Ausdruck. Aber das bauen dieser Regex und Sicherstellung der Korrektheit wird durch die Montage wesentlich erleichtert von den vom RFC definierten "Tokens". Jeder dieser Token ist in der beiliegenden Unit-Testdatei getestet.
Zu installieren mit pip
pip install validate_email
und Sie benötigen das pyDNS-Modul zur Überprüfung von SMTP-Servern
pip install pyDNS
oder von Ubuntu
apt-get python3-dns
E-Mail-Adressen sind nicht so einfach, wie es scheint! Beispielsweise ist Bob_O'[email protected] eine gültige E-Mail-Adresse.
Ich hatte etwas Glück mit dem lepl-Paket ( http://www.acooke.org/lepl/ ). Es kann E-Mail-Adressen wie in RFC 3696 angegeben validieren: http://www.faqs.org/rfcs/rfc3696.html
Ich habe alten Code gefunden:
import lepl.apps.rfc3696
email_validator = lepl.apps.rfc3696.Email()
if not email_validator("[email protected]"):
print "Invalid email"
Ich habe eine ausgezeichnete (und getestete) Methode gefunden, um nach einer gültigen E-Mail-Adresse zu suchen. Ich füge meinen Code hier ein:
# 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 = ["[email protected]", "[email protected]", "wha.t.`1an?ug{}[email protected]"]
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.`?{}][email protected]\w+\.\w+)\"?"
# here i test my function passing my pattern
test_email(pattern)
Ich sehe hier viele komplizierte Antworten. Einige von ihnen kennen keine einfache, echte E-Mail-Adresse oder haben falsch positive Ergebnisse. Nachfolgend wird am einfachsten getestet, ob es sich bei der Zeichenfolge um eine gültige E-Mail handelt. Es testet gegen TLDs mit 2 und 3 Buchstaben. Jetzt, wo Sie technisch größere haben können, möchten Sie vielleicht die 3 auf 4, 5 oder sogar 10 erhöhen.
import re
def valid_email(email):
return bool(re.search(r"^[\w\.\+\-]+\@[\w]+\.[a-z]{2,3}$", email))
Dieses Problem wird normalerweise mit Regex gelöst. Es gibt jedoch viele Lösungsvarianten. Je nachdem, wie streng Sie sein müssen, ob Sie benutzerdefinierte Anforderungen für die Validierung haben oder eine gültige E-Mail-Adresse akzeptieren.
Siehe diese Seite als Referenz: http://www.regular-expressions.info/email.html
E-Mail-Adressen sind unglaublich kompliziert. Hier ein Beispiel für einen regulären Ausdruck, der mit jeder RFC822-gültigen Adresse übereinstimmt: http://www.ex-parrot.com/pdw/Mail-RFC822-Address.html
Sie werden feststellen, dass es wahrscheinlich länger ist als der Rest Ihres Programms. Es gibt sogar ganze Module für Perl, um E-Mail-Adressen zu überprüfen. Sie werden also wahrscheinlich nichts 100% perfektes Regex bekommen und gleichzeitig lesbar sein. Hier ist ein Beispiel für einen rekursiven Abstiegsparser: http://cpansearch.Perl.org/src/ABIGAIL/RFC-RFC822-Address-2009110702/lib/RFC/RFC822/Address.pm
sie müssen jedoch entscheiden, ob Sie perfektes Parsen oder einfachen Code benötigen.
Der oben genannte Parseadr würde das nachfolgende @ ignorieren.
from email.utils import parseaddr
parseaddr('[email protected]@ccc.com') ('', '[email protected]')
Wahrscheinlich Adresse extrahieren und mit dem Original vergleichen?
Hat jemand validate.email versucht?
Wenn Sie die Mail aus einer langen Zeichenfolge oder Datei herausnehmen möchten, probieren Sie dies aus.
([^@|\s][email protected][^@]+\.[^@|\s]+)
Beachten Sie, dass dies funktioniert, wenn Sie vor und nach Ihrer E-Mail-Adresse ein Leerzeichen haben. Wenn Sie keinen Platz haben oder spezielle Zeichen haben, können Sie versuchen, es zu ändern.
Arbeitsbeispiel:
string="Hello ABCD, here is my mail id [email protected] "
res = re.search("([^@|\s][email protected][^@]+\.[^@|\s]+)",string,re.I)
res.group(1)
Dadurch wird [email protected] aus dieser Zeichenfolge entfernt.
Beachten Sie, dass dies möglicherweise nicht die richtige Antwort ist. Aber ich habe sie hier veröffentlicht, um jemandem zu helfen, der bestimmte Anforderungen wie mich hat
import re
def email():
email = raw_input("enter the mail address::")
match = re.search(r'[\w.-][email protected][\w.-]+.\w+', email)
if match:
print "valid email :::", match.group()
else:
print "not valid:::"
email()
import validator
is_valid = validate_email('[email protected]',verify=True)
if (is_valid==True):
return 1
else:
return 0
Siehe validate_email docs .
Verwenden Sie diese Filtermaske für die E-Mail-Eingabe: EmailMask: /[\w.\[email protected]'"!#$%&'*+/=?^_
{|} ~]/i`
E-Mail-ID finden:
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..
Zur Überprüfung der E-Mail verwenden Sie 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("[email protected]")
"^[\w\.\+\-]+\@[\w]+\.[a-z]{2,3}$"
Fand dies für eine praktische Implementierung:
[^@\s][email protected][^@\s]+\.[^@\s]+