2016-07-16 2 views
-3

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

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

Какие сообщения вы хотите показать, кстати? –

+0

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

+0

Ваше регулярное выражение для проверки действительных адресов электронной почты не позволяет использовать весь спектр возможностей, таких как имена, разделенные точками, дополнительные символы, многосегментные доменные имена. Например: «Ro.Yo.Me + stackoverflow @ ix.netcom.com» полностью соответствует стандарту, но не прошел тест. Также у вас есть ошибка в выражении, последний класс символов отсутствует закрывающая скобка. –

ответ

0

Предисловие

Есть много правил, которые описывают действительный адрес электронной почты. Предлагаемый мною решение здесь только проверить правила, описанные в исходном вопросе ^[A-Za-z0-9]{5,25}@{1}[A-Za-z]{5,15}[.]{1}[A-Za-z {3,10}$

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

^[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. удалить {1} квантор, так как они не нужны
  2. удалите A-Z из классов персонажей и используйте флагом, нечувствительный к регистру
  3. вставьте закрытие ] на последнем ча Класс racter

Полученное выражение выглядит следующим образом:

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

Описание

^(?=(?:.*[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

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

** Для того, чтобы увидеть изображение лучше, просто щелкните правой кнопкой мыши на изображение и выберите пункт Открыть в новом окне

Это регулярное выражение будет делать следующее:

  • Пользователи ненавидят играть итеративный игру где они исправляют одну вещь за раз, поэтому это выражение проверяет все заранее и расскажет вам все, что не так.
  • Выполняет различные тесты, если эти тесты будут найдены, будет занесена соответствующая группа захваченных имен.Если группа захвата не заполняется, то тест пройден
    • Слишком много @ символов
    • в разделе доменных имен
    • найти недопустимые символы Нет .. Этот тест покажет только первый недопустимый символ найден перед @ и первым недопустимым символом после @
    • Имя пользователя слишком короткий или слишком длинный
    • имя домена является слишком коротким или длинным. например: @gm.com или @TheForceIsWithYouAllTheTime.com Боковое примечание gm.com является допустимым доменным именем для General Motors.
    • Доменное имя верхнего уровня слишком короткое или слишком длинное. например: @gmail.au или @gmail.WhyIsThisNameSoLong Боковое примечание .au является действительным именем верхнего уровня.
  • выглядит для пространств

Пример

Live Demo

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

Пример текста

[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] 

Образец Матчи

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]`