2023. 10. 4. 21:34ㆍHackerRank-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
'HackerRank-Python' 카테고리의 다른 글
Prepare > Python > Basic Data Types > Find the Runner-Up Score! (0) | 2024.03.21 |
---|---|
itertools > Maximize It! (1) | 2024.02.12 |
Prepare > Python > Python Functionals > Reduce Function (0) | 2023.10.03 |
Prepare > Python > Built-Ins > ginortS (0) | 2023.10.02 |
Prepare > Python > Built-Ins > Athlete Sort (0) | 2023.10.01 |