IT/프로그래밍

[파이썬] re 모듈 정규표현식 실습 문제 [패스트 캠퍼스 챌린지 46일]

뜻밖의 행복 2022. 3. 10. 23:59
반응형

안녕하세요? 뜻밖의 행운입니다.

대통령선거 결과가 나온 날이네요 

그리고 저의 도전은 46일차 입니다. 이제 4일 남았습니다.

금, 토, 일, 월 끝! 

그리고 마지막 후기 면 끝이네요 길었다 길었어

하지만 또 금방 시간이 지나간것 같기도 하고 ㅎ

오늘은 정규표현식 배운 내용을 종합적으로 응용해보는 시간이었습니다.

 

문제는 총 2문제였습니다.

 

1번 문제 

 

민수는 날짜 형식을 검사하는 정규표현식을 만드는 업무를 받았다. 업무내용은 다음과 같다.

 요건 : "YYYY/MM/DD 형식으로 표현된 날짜를 검사. "

     1.연도는 4자리 숫자로 제한한다 (1000~9999)
     2.월은 1~12, 일은 1~31일 까지 가능하다
입력 받은 데이터

    '2022/08/08',

    '1000/01/01',

    '9999/12/31',

    '900/02/02',

    '12000/10/26',

    '2021/13/01',

    '2023/2/02',

    '2024/06/3'

    '2023/06/35'

풀이

# 날짜 형식 검사하기

# YYYY/MM/DD 형식으로 표현된 날짜를 검사하는 정규표현식 만들기

# 1. 연도는 4자리 숫자로 제한한다 (1000~9999)
# 2. 월은 1월~12월, 일은 1일~31일 까지 가능하다.


# ^\d{4}/(0[1-9]|1[0-2])/(0[1-9]|[12][0-9]|3[01])$

import re

datas = [
    '2022/08/08',
    '1000/01/01',
    '9999/12/31',
    '900/02/02',
    '12000/10/26',
    '2021/13/01',
    '2023/2/02',
    '2024/06/3',
    '2023/06/35'
]

regex = '^\d{4}/(0[1-9]|1[0-2])/(0[1-9]|[12][0-9]|3[01])$'

for data in datas:
    matchObj = re.match(regex, data)
    result = (lambda x : True if x != None else False)(matchObj)
    print(f'{data} {result}')

정규 표현식이니까 핵심은

'^\d{4}/(0[1-9]|1[0-2])/(0[1-9]|[12][0-9]|3[01])$'

위 내용입니다. 

앞자리 연도가 4자리이니까 ^\d{4} 로 숫자 4자리로 제한 하는 것이 보입니다.

(0[1-9]|1[0-2]) 

의 뜻은 앞자리는 0이고 뒤에 한자리는 1 ~ 9 까지 올 수 있다. 또는 

앞자리는 1 이고 뒤에 한자리는 0 ~ 2 까지 올 수 있다는 것으로 1월 ~ 12월을 포함합니다. 

그렇다면 뒤에 일자는?

(0[1-9]|[12][0-9]|3[01])

월을 했으면 일자도 어렵지 않지요 

앞자리는 0, 1, 2, 3이 올 수 있으니 

0[1-9], [12], 3 으로 제한을 걸고 3의 경우 30일 31일 밖에 없으니

3[01] 로 제한을 하면 되는 것을 알 수 있습니다. 

 

그럼 실제로 잘 동작하는지 볼까요?

 

오 True, False가 조건에 따라 잘 반영 되는 것이 보입니다. 굳굳!!

 

문제 2 

 

자사상품이벤트를 위해 고객들로부터 이메일을 입력 받았다.

고객들이 이메일 형식을 올바르게 입력했는지 검사하는 정규표현식을 작성해보자.

조건 
1.이메일은 ID 파트와 host 파트가 있다. (ID @ host)
2.ID 파트는 영문 대소문자, 숫자, 특수문자(-_)가 들어갈 수 있다.
3.host 파트는 영문 대소문자, 숫자, 특수문자(-)
4.host 파트는 2개 이상의 도메인으로 구성 될 수 있다.

입력받은 메일

'startcoding@maver.com',

    'start-coding@maver.com',

    'start_coding@maver.co.kr',

    'startcoding@k-mail.com',

    '@maver.com',

    'startcoding?@k-mail.com',

    'startcoding@k-mail',

    'startcoding@maver'

 

풀이 

# ^[\w-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$

import re

regex = re.compile('^[\w-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$')

datas = [
    'startcoding@maver.com',
    'start-coding@maver.com',
    'start_coding@maver.co.kr',
    'startcoding@k-mail.com',
    '@maver.com',
    'startcoding?@k-mail.com',
    'startcoding@k-mail',
    'startcoding@maver'
]

for data in datas:
    matchObj = regex.match(data)
    result = (lambda x : True if x != None else False)(matchObj)
    print(f'{data} {result}')

여기서 제일 중요한 것은 메일 형식의 제한이고 이것을 어떻게 정규 표현식으로 공통점을 찾을까 입니다.

'^[\w-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$')

\w 의 경우 문자를 의미하죠 즉 모든 문자가 올 수 있다는 것을 의미하고 그 문자가 한 글자 이상이라고 조건을 줍니다.

그리고 중간에는 반드시 @ 표시가 들어가니 @ 를 넣어주고요 

그리고 호스트명이 들어가야 하니 [a-zA-Z0-9-] 

으로 해주고 그리고 .com 또는 .co.kr 등 이 나올 수 있으니 .[a-zA-Z0-9-.]

저렇게 . 을 잡아줘야겠죠?

 

잘 돌아가나 볼까요?

 

굳 잘 되는 것이 보입니다. 뿌듯하네요

 

 

반응형