Day 28 - RegEx, Patterns, and Intro to Databases

최근 배우고 있는 JavaScript에서도 정규표현식을 배우고 있어서 오랜만에 파이썬 정규표현식 까먹을까봐 해보았다.

문제 풀이

문제 해석

RegEx(정규표현식)를 이용하여 이메일의 형식이 맞는지 확인하는 문제다. 지금까지 나온 것들 중 가장 실생활에 유용한 듯.

Task

  • 이름과 이메일주소를 가진 데이터 테이블에, N개의 데이터가 있다.
  • @gmail.com으로 끝나는 이메일을 가진 사람들 이름을 리스트로 만들어라.
  • 제한사항 (Constraints)
    • 이름은 소문자로만 구성되어야 하며 20글자를 넘으면 안된다.
    • email ID는 소문자, @와 .으로만 구성되어야 하며 50글자를 넘으면 안된다.
  • 결과물은 알파벳 순서로 정렬한 배열로 만들어 출력할 것

Input Format

  • 첫줄은 데이터 숫자인 N, 그 다음엔 N개의 행이 올 건데, 각 N은 공백으로 구분된 이름과 이메일이 온다.
  • 주어진 코드를 보면 알 수 있듯이, 친절하게 이름은 firstName이란 변수에, email은 emailID라는 변수에 넣어준다.

Output Format

  • 알파벳 순서로 정렬된 gmail 이메일 계정을 가진 사람들의 이름들이 각각 한 줄씩 출력되어야 한다.

문제 풀이

이미 주어진 코드 해석

1
2
3
4
5
6
7
8
9
10
11
# import들은 생략

if __name__ == '__main__':
N = int(input())

for N_itr in range(N):
firstNameEmailID = input().split()

firstName = firstNameEmailID[0]

emailID = firstNameEmailID[1]

아까 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
    14
    if __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')

느낀 점

너무 어렵지 않으면서도 잊어버리지 않게 정규표현식 비롯 여러가지 메서드와 어트리뷰트를 다 써본 좋은 문제였다.