2016-07-16 4 views
-3

사용자가 입력 한 전자 메일 주소를 정규식과 비교하여 검사하는 프로그램을 작성했습니다. 사용자가 정규식과 일치하지 않는 잘못된 이메일을 입력하면 사용자에게 이메일이 틀렸다는 것을 알리는 print 문이 실행됩니다. 내가 뭘하고 싶은지는 왜 전자 메일이 틀린 지, 즉 사용자가 입력 한 전자 메일이 일치하지 않는 정규 표현식 부분을 식별 할 수 있는지를 말할 수 있어야합니다. 나는 이것을하는 방법을 확신하지 못한다.문자열의 어느 부분이 정규식과 일치하지 않는지 찾기

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

정규식이 일치하거나 일치하지 않습니다 ... 회색 영역이 없습니다. 코드에서 전자 메일 주소를 구문 분석하고 특정 문제를보고해야합니다. 실제로는 사용자에게 그다지 도움이되지 않을 것입니다. –

+0

유효한 전자 메일 주소를 테스트하는 정규식은 점으로 구분 된 이름, 추가 기호, 여러 세그먼트 화 된 도메인 이름과 같은 모든 범위의 가능성을 허용하지 않습니다. 예를 들면 :'Ro.Yo.Me + stackoverflow @ ix.netcom.com'은 표준에 따라 완전하게 유효하지만 테스트에 실패합니다. 또한 표현식에 오류가 있으며 마지막 문자 클래스에 닫는 대괄호가 없습니다. –

답변

0

Foreward

. 단지 당신이 원래의 질문에 설명 된 규칙 ^[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. 를 사용

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

    ** 더 나은 이미지를 보려면, 단순히 이미지를 마우스 오른쪽 버튼으로 클릭 racter 클래스는

결과 표현처럼 보인다 새 창에서보기를 선택하십시오.

** 단순히 바로이 정규 표현식은 다음을 수행합니다

새 창에서 이미지를 선택보기를 클릭, 더 나은 이미지를 보려면 :

  • 사용자가 반복적 인 게임을 싫어을 한 번에 한 가지만 고치기 때문에이 표현은 모든 것을 먼저 테스트하고 잘못된 모든 것을 알려줍니다.
  • 다양한 테스트를 실행합니다. 테스트가 발견되면 연관된 명명 된 캡처 그룹이 채워집니다.캡처 그룹이 채워지지 않으면, 테스트는 @ 문자
  • 잘못된 문자를 찾을 도메인 이름 섹션에서 없음 . 너무 많은
    • 을 통과시켰다. 이 테스트는 단지 @ 전에 발견 된 첫 번째 잘못된 문자와 @
    • 사용자 이름이 너무 짧거나
    • 도메인 이름이 너무 짧거나 긴 너무 긴 후 첫 잘못된 문자가 표시됩니다. 예 : @gm.com 또는 @TheForceIsWithYouAllTheTime.com 사이드 노트 gm.com은 제너럴 모터스의 유효한 도메인 이름입니다.
    • 최상위 도메인 이름이 너무 짧거나 길습니다. 예 : @gmail.au 또는 @gmail.WhyIsThisNameSoLong 사이드 노트 .au은 유효한 최상위 레벨 이름입니다.
  • 공백

라이브 데모

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

샘플 텍스트

을 찾습니다 0
[email protected] 
[email protected] 
[email protected] 
[email protected]@gmail.com 
[email protected] 
RoYoMiGmail.com 
[email protected]!m 
[email protected] 
[email protected] 
[email protected]c 
[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]` 
관련 문제