최근 배우고 있는 JavaScript에서도 정규표현식을 배우고 있어서 오랜만에 파이썬 정규표현식 까먹을까봐 해보았다.
문제 풀이
문제 해석
RegEx(정규표현식)를 이용하여 이메일의 형식이 맞는지 확인하는 문제다. 지금까지 나온 것들 중 가장 실생활에 유용한 듯.
Task
- 이름과 이메일주소를 가진 데이터 테이블에, N개의 데이터가 있다.
@gmail.com
으로 끝나는 이메일을 가진 사람들 이름을 리스트로 만들어라.- 제한사항 (Constraints)
- 이름은 소문자로만 구성되어야 하며 20글자를 넘으면 안된다.
- email ID는 소문자, @와 .으로만 구성되어야 하며 50글자를 넘으면 안된다.
- 결과물은 알파벳 순서로 정렬한 배열로 만들어 출력할 것
Input Format
- 첫줄은 데이터 숫자인 N, 그 다음엔 N개의 행이 올 건데, 각 N은 공백으로 구분된 이름과 이메일이 온다.
- 주어진 코드를 보면 알 수 있듯이, 친절하게 이름은 firstName이란 변수에, email은 emailID라는 변수에 넣어준다.
Output Format
- 알파벳 순서로 정렬된 gmail 이메일 계정을 가진 사람들의 이름들이 각각 한 줄씩 출력되어야 한다.
문제 풀이
이미 주어진 코드 해석
1 | # import들은 생략 |
아까 input format에서 다 얘기했듯이 이름과 이메일이 각각의 변수에 할당되었으니 이제 그것을 가지고 정규표현식에 맞는지 걸러내면 된다.
코드 작성하기
- 내가 해야할 것은 주어진 Task의 제한사항에 맞는 이들을 추려 빈 배열에 append하는 것. 이를 위해 빈 배열을 for문 이전에 하나 만들어준다.
- emailID이 gmail인 동시에 제한사항을 준수하도록
re.fullmatch(r'[a-z@\.]{1,50}@gmail\.com', emailID)
으로 매치할 경우의 object를 할당한 후 변수 matchingEmail에 담는다. - email이 매치되는 경우의 이름을 배열에 담아야 하니
if matchingEmail
로 매칭 오브젝트가 존재할 경우 true임을 이용하여 append 메서드를 실행시킨다. - for문이 다 돌아가고 나서 알파벳 정렬을 위해
sort()
메서드를 가동. - 프린트의 인수로 넣어줄 때, 리스트 안의 이름들을 하나하나 풀어주게끔
*(asterisk)
를 리스트를 가리키는 변수 앞에 붙여준다. sep = '\n'
을 넣어 개행하며 다음 요소를 프린트하도록 한다.1
2
3
4
5
6
7
8
9
10
11
12
13
14if __name__ == '__main__':
N = int(input())
reg_list = []
for N_itr in range(N):
firstNameEmailID = input().split()
firstName = firstNameEmailID[0]
emailID = firstNameEmailID[1]
matchingEmail = re.fullmatch(r'[a-z@\.]{1,40}@gmail\.com', emailID)
if matchingEmail:
reg_list.append(firstName)
reg_list.sort()
print(*reg_list, sep='\n')
느낀 점
너무 어렵지 않으면서도 잊어버리지 않게 정규표현식 비롯 여러가지 메서드와 어트리뷰트를 다 써본 좋은 문제였다.