2016-07-16 9 views
-3

Ich habe ein Programm geschrieben, das E-Mail-Adressen überprüft, die von einem Benutzer gegen eine Regex eingegeben werden. Wenn ein Benutzer eine falsche E-Mail eingibt, die nicht mit der Regex übereinstimmt, wird eine Druckanweisung ausgeführt, die den Benutzer darüber informiert, dass die E-Mail falsch ist. Was ich tun möchte ist, ihnen zu sagen, warum die E-Mail falsch ist, mit anderen Worten, die Teile der Regex identifizieren, die die E-Mail von dem Benutzer eingegeben nicht übereinstimmt. Ich bin unsicher, wie ich das machen soll.Finden, welche Teile einer Zeichenkette nicht mit der Regex übereinstimmen

import re 
student = [] 
while True: 
    email = input("Please enter the email, for eg [email protected]") 
    if not re.match("^[A-Za-z0-9]{5,25}@{1}[A-Za-z]{5,15}[.]{1}[A-Za-z {3,10}$", email): 
     print("Sorry incorrect format, please re-enter email") 
    else: 
     student.append(email) 
     print(student) 
     break 
+0

Welche Art von Nachrichten, die Sie durch die Art und Weise zeigen möchten? –

+0

Regex passt entweder oder nicht ... es gibt keine Grauzone. Sie müssten die E-Mail-Adresse im Code analysieren und über bestimmte Probleme berichten. In Wirklichkeit wird es dem Benutzer wahrscheinlich nicht so viel helfen. –

+0

Ihre Regex zum Testen auf gültige E-Mail-Adressen bietet nicht die volle Palette von Möglichkeiten wie Punkt getrennte Namen, Additionssymbole, mehrere segmentierte Domänennamen. Zum Beispiel: 'Ro.Yo.Me + stackoverflow @ ix.netcom.com' ist vollständig gültig für den Standard, würde aber Ihren Test nicht bestehen. Sie haben auch einen Fehler in Ihrem Ausdruck, die letzte Zeichenklasse fehlt die schließende Klammer. –

Antwort

0

Foreward

viele Regeln gibt, die eine gültige E-Mail-Adresse beschreiben. Meine vorgeschlagene Lösung ist hier nur die Regeln testen Sie in Ihrer ursprünglichen Frage beschrieben ^[A-Za-z0-9]{5,25}@{1}[A-Za-z]{5,15}[.]{1}[A-Za-z {3,10}$

Ich empfehle die folgenden Änderungen an Ihrer Basis Ausdruck:

^[A-Za-z0-9]{5,25}@{1}[A-Za-z]{5,15}[.]{1}[A-Za-z {3,10}$ 
    2    1 2    1 2  3 
  1. entfernen Sie die {1} quantifier, da diese nicht notwendig sind,
  2. die A-Z aus den Charakterklassen entfernen, und die unempfindliche Flagge Fall verwenden
  3. eine Schließung ] am letzten cha einfügen racter Klasse

Der resultierende Ausdruck wie folgt aussieht:

^[a-z0-9]{5,25}@[A-Za-z]{5,15}[.][a-z]{3,10}$ 

Beschreibung

^(?=(?:.*[email protected]*?(?P<TooManyAtSigns>@))?)(?=(?P<NoAtSign>[^@\n]*$)?)(?=(?:[a-z0-9]*?(?P<BadCharacterInUsername>[^[email protected]\n]))?)(?=(?:.*[email protected][a-z.]*?(?P<BadCharacterInDomain>[^a-z.\n]))?)(?=(?:(?:(?P<UsernameTooShort>[a-z0-9.]{0,4})|(?P<UsernameTooLong>[a-z0-9.]{26,}))@)?)(?=(?:.*[email protected](?:(?P<DomainNameTooShort>[A-Za-z]{0,4})|(?P<DomainNameTooLong>[a-z]{16,}))[.])?)(?=(?:.*[email protected](?P<DomainNameMissingDot>[^.\n]*)$)?)(?=(?:.*[email protected]*?[.](?:(?P<TopLevelDomainNameTooShort>[a-z]{0,2})|(?P<TopLevelDomainNameTooLong>[a-z]{11,}))$)?)(?=(?:.*?(?P<FoundASpace>\))?)(?P<email>.*)$

enter image description here

** besser, das Bild zu sehen, einfach rechts auf das Bild klicken und wähle Ansicht in neuem Fenster

** Um das Bild besser zu sehen, einfach mit der rechten klicken Sie auf das Bild und wählen Sie Ansicht in einem neuen Fenster

Dieser reguläre Ausdruck folgendes tun:

  • Benutzer ein iteratives Spiel Hass spielen wo sie eine Sache nach der anderen korrigieren, so testet dieser Ausdruck alles im Voraus und sagt dir alles, was falsch ist.
  • Führt verschiedene Tests aus. Wenn diese Tests gefunden werden, wird die zugeordnete benannte Erfassungsgruppe aufgefüllt.Wenn die Capture-Gruppe nicht ausgefüllt ist, dann übergeben Sie den Test
    • Zu viele @ Zeichen
    • Kein . im Domainnamen Abschnitt
    • ungültige Zeichen finden. Dieser Test wird nur das erstes vor den @ gefunden ungültige Zeichen und die ersten ungültigen Zeichen nach dem @
    • Benutzername ist zu kurz oder zu lang
    • Domain Name zu kurz oder lang ist. z. B. @gm.com oder @TheForceIsWithYouAllTheTime.com Seitennotiz gm.com ist ein gültiger Domänenname für General Motors.
    • Top Level Domain Name ist zu kurz oder zu lang. z. B. @gmail.au oder @gmail.WhyIsThisNameSoLong Seitennotiz .au ist ein gültiger Name der obersten Ebene.
  • Sucht Räume

Beispiel

Live Demo

https://regex101.com/r/cQ0jR6/2

Beispieltext

[email protected] 
[email protected] 
[email protected] 
[email protected]@gmail.com 
[email protected] 
RoYoMiGmail.com 
[email protected]!m 
[email protected] 
[email protected] 
[email protected] 
[email protected]@Gma.InterGalatic 
[email protected] 

Probe Spiele

MATCH 1 
email [0-16] `[email protected]` 

MATCH 2 
UsernameTooShort [17-20] `RoY` 
email [17-30] `[email protected]` 

MATCH 3 
UsernameTooLong [31-62] `RoYoMiInternationalManOfMystery` 
email [31-72] `[email protected]` 

MATCH 4 
TooManyAtSigns [81-82] `@` 
BadCharacterInUsername [75-76] `!` 
BadCharacterInDomain [81-82] `@` 
email [73-91] `[email protected]@gmail.com` 

MATCH 5 
DomainNameTooShort [99-101] `gm` 
email [92-105] `[email protected]` 

MATCH 6 
NoAtSign [106-121] `RoYoMiGmail.com` 
BadCharacterInUsername [117-118] `.` 
email [106-121] `RoYoMiGmail.com` 

MATCH 7 
BadCharacterInDomain [133-134] `!` 
DomainNameMissingDot [129-135] `gmco!m` 
email [122-135] `[email protected]!m` 

MATCH 8 
DomainNameTooLong [143-177] `ThisIsNotTheDroidYouWereLookingFor` 
email [136-181] `[email protected]` 

MATCH 9 
TopLevelDomainNameTooShort [195-197] `co` 
email [182-197] `[email protected]` 

MATCH 10 
TopLevelDomainNameTooLong [211-223] `InterGalatic` 
email [198-223] `[email protected]` 

MATCH 11 
TooManyAtSigns [228-229] `@` 
BadCharacterInDomain [228-229] `@` 
UsernameTooShort [224-227] `RoY` 
DomainNameTooShort [229-232] `Gma` 
TopLevelDomainNameTooLong [233-245] `InterGalatic` 
email [224-245] `[email protected]@Gma.InterGalatic` 

MATCH 12 
DomainNameTooLong [253-282] `MoreDroidsYouAreNotLookingFor` 
email [246-286] `[email protected]` 
Verwandte Themen