Prepare > Python > Python Functionals > Validating Email Addresses With a Filter

2023. 10. 4. 21:34HackerRank-Python

 

Validating Email Addresses With a Filter | HackerRank

This question covers the concept of filters.

www.hackerrank.com

 

문제


Valid email addresses must follow these rules:

  • It must have the username@websitename.extension format type.
  • The username can only contain letters, digits, dashes and underscores [a-z], [A-Z], [0-9], [-_].
  • The website name can only have letters and digits [a-z], [A-Z], [0-9] .
  • The extension can only contain letters [a-z], [A-Z] .
  • The maximum length of the extension is 3.

 

You are given an integer N followed by N email addresses. Your task is to print a list containing only valid email addresses in lexicographical order.

 

=> N개의 이메일 주소를 줄건데, 사용자명@웹사이트이름.확장자 형태로 이뤄진것들 중 유요한 메일 주소를 리스트에 담아 리턴하라

  • 사용자명은 알파벳, 숫자, 언더바, 하이픈 으로 구성
  • 웹사이트이름은 알파벳, 숫자로 구성
  • 확장자는 알파벳으로 구성

lambda함수 사용 어쩌고 하는데..모르겠다

 

 

 

코드


import re

def fun(s):
    pattern = r'^[a-zA-Z0-9_-]+@[a-zA-Z0-9]+\.[a-zA-Z]{1,3}$'
    
    return bool(re.match(pattern, s))
    
 
def filter_mail(emails):
    return list(filter(fun, emails))

if __name__ == '__main__':
    n = int(input())
    emails = []
    for _ in range(n):
        emails.append(input())

filtered_emails = filter_mail(emails)
filtered_emails.sort()
print(filtered_emails)

 

 

 

 

노트


filter()

filter(조건으로 사용할 함수, iterable)
  • iterable중 함수 조건에 맞는 요소들만 리턴
  • filter객체로 반환하므로 리스트 등에 담아주자
<filter object at 0x11132f7c0>

 

 

정규표현식

문자 클래스

[a-z] : 소문자 알파벳 포함인지

[a-zA-Z] : 모든 알파벳 포함인지

[a-zA-Z0-9]: 영문자와 숫자 포함인지

[^a-z] : 모든 소문자를 제외한 나머지들 포함인지

 

 

메타문자

. (dot) : 줄바꿈을 제외한 모든 문자

* (asterisk) : 0번 이상의 반복

+ (plus) : 1번 이상의 반복

{n} : 정확히 n번 반복

{n, m} : n~m번 반복

? : {0, 1}을 의미. 즉 없거나 한 번 존재함

 

...정리...는 참조에 잘 돼있음. 진짜임

 

 

re모듈

import re
p = re.compile('ab*')
  • re.compile로 정규 표현식(ab*)을 컴파일
  •  re.compile의 리턴값을 p에 저장

 

 

re.match() : 문자열 전체가 정규식에 들어맞는지(re.match객체 혹은 None 리턴)

 

 

 

 

해석을 해보자

import re
  • 정규표현식으로 검색하기 위해 모듈 호출

 

def fun(s):
    pattern = re.compile('^[a-zA-Z0-9_-]+@[a-zA-Z0-9]+\.[a-zA-Z]{1,3}$')
  • re.compile로 정규표현식을 컴파일 함
  • ^ 는 맨 앞을 뜻함(문자클래스 [~] 안에 들어가는 부정의 ^ 와는 다른 의미)
  • [a-zA-Z0-9_-] 는 소문자, 대문자, 숫자, 언더바, 하이픈을 포함하는 문자클래스 의미
  • + 는 위의 알바벳,숫자,언더바, 하이픈 으로 이뤄진 문자가 하나 이상 존재함을 의미
  • @ 는 저 순서에 @가 있냐고 묻는것
  • \. 은 메타문자 . 이 아니라 순수하게 .이 저 순서에 있냐고 묻는 것
  • {1, 3}은 최소1번, 최대 3번 반복을 의미
  • $는 문자의 맨 뒤를 의미

 

 

    return bool(re.match(pattern, s))
  • match는 객체 혹은 None값을 리턴하므로 None을 bool함수로 bool값 변환
  • 왜 변환하는지는 미리 짜여진 코드 읽어보면 됨

 

 

 

 

참조


 

파이썬의 filter 내장 함수로 데이터 추출하기

Engineering Blog by Dale Seo

www.daleseo.com

 

08-2 정규 표현식 시작하기

정규 표현식에서는 메타 문자(meta characters)를 사용한다. 먼저 메타 문자가 무엇인지 알아보자. [TOC] ## 정규 표현식의 기초, 메타 문자 메타 문자란 원…

wikidocs.net

 

Discussion on Validating Email Addresses With a Filter Challenge

This question covers the concept of filters.

www.hackerrank.com