본문 바로가기
재미로 하는 코딩

정규표현식을 사용한 여러가지 유효성 검사

by 헬푸밍 2022. 12. 29.

정규표현식이라는 말을 들어보셨나요?

정규표현식은 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어입니다.

오늘은 이메일, 핸드폰 번호, 주민등록번호 3가지를 검사해보는 컨텐츠입니다..

정규표현식을 이용해 검사해보자구요~

 

1. 이메일

이메일의 정규표현식은 무엇일까요?

바로 아래와 같습니다.

^[a-zA-Z0-9.+_-]+@[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$

-^는 정규표현식의 시작을 알려주고, $는 끝을 알려주는 문자입니다.(^가 []안에 있다면 여집합의 의미를 가집니다.)

-[]는 []안에 있는 문자들과 매치한다는 뜻입니다.

-[a-zA-Z0-9.+_-]는 소문자, 대문자, 숫자 0~9, ., +, _, -가 1번 나오는 것을 의미합니다.

-그 뒤의 +는 1번 이상 반복되는 것을 의미합니다.

-즉, [a-zA-Z0-9.+_-]+는 소문자, 대문자, 숫자 0~9, ., +, _, -가 1번 이상 반복되는 것을 의미합니다.

-@는 문자 그대로 @가 와야함을 뜻합니다.

-[a-zA-Z0-9]+는 소문자, 대문자, 숫자가 1번 이상 반복되는 것을 의미합니다.

-\.은 .이 와야하는 것을 의미하는데 .은 정규표현식에 사용되는 특수문자이므로 \를 반드시 붙여줘야합니다.(정규표현식에서 .은 줄바꿈 문자인 \n을 제외한 모든 문자와 매치한다는 뜻입니다.)

-[a-zA-Z]{2,3}은 대문자 소문자가 2번 이상 3번 이하 반복되는 것을 의미합니다.(+와 {1,}은 같은 의미로 해석할 수 있습니다.)

 

이렇게 이메일의 정규표현식을 해석해봤는데요!

 

그럼 이메일이 유효한지 확인해보는 코드를 짜봅시다!

import re #정규표현식을 사용하기 위해 re모듈 import

email_addr = input('이메일 주소를 입력해주세요 : ')

def check_email(email_addr):
    reg = "^[a-zA-Z0-9.+_-]+@[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$"
    if bool(re.match(reg,email_addr)):
        print("유효한 이메일 주소입니다.")
    else:
        print("유효한 이메일 주소가 아닙니다.")
#이메일의 유효성을 판단하는 함수
check_email(email_addr) #함수 실행

제 이메일 주소를 한 번 넣어 볼까요?

제 이메일은 유효합니다 ㅎㅎ

 

그럼 한 번 이메일이 아닌 것을 넣어봅시다.

 

유효한 이메일이 아니군요...

 

이메일의 정규표현식은 여기까지 입니다!


2. 핸드폰번호

핸드폰 번호의 유효성 검사를 한 번 해볼까요?

 

핸드폰 번호는 보통 ***-****-****의 형식을 가지는 데여...

 

이제는 010번호만 서비스한다고 합니다!

 

또 010번호는 가운데가 4자리라고 하니 4자리 정규표현식을 쓰면 될 것 같군요

 

^010-\d{4}-\d{4}$

-^010-은 010-로 시작한다는 것을 의미합니다.

-\d{4}는 0~9까지의 숫자가 4번 반복됨을 의미합니다.

 

그럼 핸드폰번호의 유효성을 검사하는 코드를 작성해봅시다!

 

import re

phone_num = input('핸드폰 번호를 입력해주세요 : ')

def check_phone_num(phone_num) :
  reg = "^010-\d{4}-\d{4}$"
  if bool(re.match(reg, phone_num)) :
    print("유효한 핸드폰 번호입니다.")
  else :
    print("유효한 핸드폰 번호가 아닙니다.")

check_phone_num(phone_num)

한 번 검사를 해볼까요?

유효한 핸드폰 번호이군요.

 

그럼 핸드폰 번호 형식이 아닌 것을 넣어봅시다.

유효한 핸드폰 번호가 아니군요...

 

핸드폰 번호는 여기까지 입니다...


3. 주민등록번호

마지막으로 주민등록번호 유효성 검사를 해봅시다!

 

주민등록번호의 정규식을 세워보기 전에 다음과 같은 정보를 알고 세워봅시다!

 

-주민등록번호는 ******-*******형식의 13자리 숫자입니다.

-맨 처음 두자리는 태어난 년도로 어느 값이 와도 상관이 없습니다.

-세번째 네번째 자리는 태어난 월로 01부터 12까지 12개의 숫자만 가능합니다.

-다섯 여섯번째자리는 태어난 일로 01부터 31까지 31개의 숫자만 가능합니다.

-일곱번째 자리는 1~4만 가능합니다.

-나머지 수들은 어느 값이 와도 상관없습니다.

 

주민등록번호의 정규표현식 입니다.

^\d{2}([0][1-9]|[1][0-2])([0][1-9]|[1-2]\d|[3][0-1])[-][1-4]\d{6}$

-^\d{2}은 처음 두자리는 정수 2자리를 의미합니다.

-([0][1-9]|[1][0-2])은 3번째 자리가 0이면 4번째 자리는 1~9까지 가능하고, 3번째 자리가 1이면 0~2까지 가능하다는 뜻입니다.(태어난 월)

-([0][1-9]|[1-2]\d|[3][0-1])은 5번째 자리가 0이면 6번째 자리는 1~9까지 가능하고, 5번째 자리가 1이나 2이면 6번째 자리에 0~9까지 가능하고 5번째 자리가 3이면 6번째 자리는 0과1만 가능하다는 뜻입니다.(태어난 일)

-[-]은 여섯번째 자리 이후 -을 의미합니다.

-[1-4]은 일곱번째 자리에 1~4만 가능하다는 의미입니다.

-\d{6}$은 나머지 6자리에 0~9까지의 어느 수가 와도 상관없다는 의미입니다.

 

그럼 마찬가지로 유효성 검사를 하는 코드를 짜봅시다!

import re

reg_num = input('주민등록번호를 입력해주세요 : ')

def check_reg_num(reg_num) :
  reg = '^\d{2}([0][1-9]|[1][0-2])([0][1-9]|[1-2]\d|[3][0-1])[-][1-4]\d{6}$'

  if bool(re.match(reg, reg_num)) :
    print("유효한 주민등록번호입니다.")
  else :
    print("유효한 주민등록번호가 아닙니다.")

check_reg_num(reg_num)

주민등록 번호를 체크해 볼까요?

이 주민번호는 유효하군요!

 

그러면 날짜(월)가 잘못된 주민등록번호를 입력해봅시다.

잘못된 주민등록번호군요... 13월은 없으니까여...ㅋㅋㅋ

 

이번에는 날짜(일)이 잘못된 주민등록번호를 입력해봅시다.

33일은 없으니까 잘못된 주민등록번호입니다!

 

이렇게 주민등록번호 까지 알아봤습니다ㅎㅎ


정규표현식을 처음 배울 때는 익숙하지 않아서 많이 어려웠는데요!

 

이번에 3가지 유효성 검사를 하면서 많이 익숙해진 것 같습니다...

 

여러분도 이메일, 핸드폰 번호, 주민등록번호 정도 정규식을 공부하시면 보다 익숙해질 것이라 생각합니다.

 

이번시간은 여기까지 입니다 ㅎㅎ 안녕~

댓글