본문 바로가기

Back-End/Python

[Python][파이썬] 정규표현식 사용하기

~ 목차 ~

파이썬에서 정규표현식을 사용해보자

 

정규표현식을 잘 모른다면?

다음 글에 잘 작성해두었으니 참고하세요!

[HTML] input pattern사용하기(정규표현식) (tistory.com)

 

[HTML] input pattern사용하기(정규표현식)

웹만들기의 기초가 되는 로그인, 회원가입에 기본적으로 사용되는 input input에 넣을 수 있는 다양한 속성중에 pattern을 이용하여 사용자가 입력할 수 있는 값을 제어할 수가 있다. 이걸 유효성 검

codingwithyou.tistory.com

 

정규식

  • regular expression : 패턴을 이용해서 문자열을 찾거나 바꾸거나 하는 기능
  • 정규식을 사용하지 않는다면?
# 전화번호 형식이 맞는지 체크하는 프로그램
def check_number(phone_number):
    if len(phone_number) != 13:
        return False
    if phone_number[0:3] != '010':
        return False
    if phone_number[3] != '-':
        return False
    for i in range(4, 8):
        if not phone_number[i].isdecimal():
            return False
    if phone_number[8] != '-':
        return False
    for i in range(9, 13):
        if not phone_number[i].isdecimal():
            return False
    return True

 

전화번호 형식이 맞는지 체크하는 코드를 쓰려면 다음과 같이 코드를 길게 써야 한다.

따라서 정규표현식이라는 것을 사용하는데 파이썬의 경우 re 라이브러리를 불러와야 한다.

 

우선 기본 정규식을 알아보자

문자 표현식

 A-Z : 대문자 알파벳만 가능
 a-z : 소문자 알파벳만 가능
 \d : 숫자0-9만 가능
    ex. '010-\d\d\d\d-\d\d\d\d'

 ^ : 시작
     => ^\d : 숫자로 시작하면... (또는 위치에 따라서 부정으로 사용가능)
 $ : 끝
     => \d$ : 숫자로 끝나면...
 . : 1개 문자
     => .... : 문자 4개
 \d : 1개 숫자
 \w : 1개 문자 or 숫자
 \s : 공백(탭, 스페이스, 줄바꿈(\n), 캐리지리턴(CR))
 [] : 범위
     => [abc] : a,b,c 중 하나 // [a-z] [1-9] [가-힣]

 

 

수량 한정자

 * : 0이상 반복
     => '', "aa", "aaaaaaa" \w*
 + : 1회이상 반복
     => '' : 거짓(0개), 'aa' : 참(2개), 'a' : 참(1개)
 ? : 0또는 1회 반복  
 {m} : m 만큼 반복
     => \d{3} : 숫자 3번 반복
 {n, m} : n회 이상, m회 이하
 (ab) : 그룹화
     => 'ab', 'abab' ,'ababab'

 

 

캐리지 리턴(CR)과 라인 피드(LF)란?

\n : 줄바꿈
- \r\n : CR+LF, 한 줄 맨 앞으로 내리기 
\r : Carriage Return(CR) 라는 의미를 가지며 일반적으로는 맨 앞으로 이동하라는 뜻입니다.
- \n : Line Feed(LF) 라는 의미를 가지며 일반적으로는 New Line, 즉 새로운 라인이라는 뜻입니다.
UNIX 기반 OS : 한 줄 내림을 LF만 이용해서 표시
Window 기반 OS : 한 줄 내림을 전통적인 방식의 CRLF를 사용
- 따라서, 내림을 CRLF로만 인식하는 메모장의 경우에는 UNIX 기반 OS로 작성한 문자를 열었을때 모두    한줄로 나오고 깨져 보이는 현상을 겪게 됨.

 

 

예시

.+ => 문자가 1회 이상 있을때
^[1-9][0-9]*$ => 0이 아닌 숫자로 시작, 0~9사이 숫자가 여러개 반복하는데 숫자로 끝난다.
^\d{6}-\d{7}$ => 주민등록번호
(Good)?Bye => GoodBye 또는 Bye
^[\w]+@[\w]+\.[A-Za-z]{2,4}$ => 이메일
                                                   ^: 문자열의 시작 
                                                   [\w]+: 하나 이상의 단어 문자(알파벳, 숫자, 밑줄)
                                                   @: 구분자 "at" 기호(@)
                                                    \.: 역슬래시는 일반적인 마침표(.)를 이스케이프하기 위해 사용
                                                    [A-Za-z]{2,4} : 최소 2자, 최대 4자의 알파벳 문자 
                                                    $ : 문자열의 끝

 

 

정규식을 파이썬에서 실습해보자.

 

 

< 문자열에서 전화번호 찾기 >

 

1. import re

2. pattern 정의

3. re.search 하기

 

import re
pattern = '010-\d\d\d\d-\d\d\d\d'
str = '제 휴대폰 번호는 010-1234-4567입니다.'

#str에서 pattern에 맞는 문자 찾아줌
found = re.search(pattern, str)
print('휴대폰 번호 형식은 : ', found)
print('휴대폰 번호 형식은 : ', found.group())

결과

휴대폰 번호 형식은 :  <re.Match object; span=(10, 23), match='010-1234-4567'>
휴대폰 번호 형식은 :  010-1234-4567

 

 

< 이메일 주소 정규식 표현 >

 

1. import re

2. pattern 정의

3. 함수에서 re.fullmatch 하기 : java의 match()와 비슷

 

import re

pattern = '^[\w]+@[\w]+\.[A-Za-z]{2,4}$'

def check_email(email_addr):
    if (re.fullmatch(pattern, email_addr)):
        print(f'{email_addr}는 유효한 주소입니다.')
    else:
        print(f'{email_addr}는 잘못된 이메일 형식입니다.')
print(check_email('abc@gamil.com'))
print(check_email('zzz@gamil.world'))

결과

abc@gamil.com는 유효한 주소입니다.
None
zzz@gamil.world는 잘못된 이메일 형식입니다.
None

 

 

< 고객정보 관리 시스템에서 이메일 정규식>

 

1. import re

2. pattern 정의

3. 함수에서 re.compile 하기 : 정규표현식을 객체로 만들어주는 함수

4. do_I()와 do_U()에 함수 적용해주기

def check_email_addr(email_addr):
    #정규표현식 객체로 만들어주는 함수 re.compile()
    pattern = re.compile('^[a-zA-Z][a-zA-Z0-9]{3,10}@[a-zA-Z0-9]{2,8}[.][a-zA-Z]{2,5}$')
    return pattern.search(email_addr)
def do_I(self, customers, index):

    customer = { 'name':'', 'gender': '', 'email': '', 'year': 0 }

    #이메일 입력
    customer['email'] = chk_input_data('이메일 주소를 입력하세요 : ', lambda x: True if check_email_addr(x) else False, upper=False)
    # customer['email'] = check('이메일 주소를 입력하세요 : ', lambda x: True if '@' in x else False, upper=False)
    
    customers.append(customer)
    index = len(customers) - 1
    return index

결과

        다음 중에서 하실 작업의 메뉴를 입력하세요.
        I - 고객 정보 입력
        P - 이전 고객 정보 조회
        C - 현재 고객 정보 조회
        N - 다음 고객 정보 조회
        U - 현재 고객 정보 수정
        D - 현재 고객 정보 삭제
        S - 고객 정보 저장 
        Q - 프로그램 종료
    i
고객정보 입력
이름을 입력하세요 : example
성별 (M/F)를 입력하세요 : m
이메일 주소를 입력하세요 : example
잘못 입력하셨습니다. 다시 입력 해 주세요.
이메일 주소를 입력하세요 : example@
잘못 입력하셨습니다. 다시 입력 해 주세요.
이메일 주소를 입력하세요 : example@gamil.
잘못 입력하셨습니다. 다시 입력 해 주세요.
이메일 주소를 입력하세요 : example@gamil.com
출생년도 4자리 입력하세요 : 0000
index : 7
customers :  [{'name': 'AAA', 'gender': 'M', 'email': 'aaa@', 'year': '1111'}, {'name': 'SSS', 'gender': 'F', 'email': 'sss@', 'year': '2222'}, {'name': 'TTTT', 'gender': 'M', 'email': 'tttt@gamil.com', 'year': '7777'}, {'name': 'AAA', 'gender': 'M', 'email': 'bbbb@gamil.com', 'year': '8888'}, {'name': 'ZZZZ', 'gender': 'F', 'email': 'ZZZZ@NAVER', 'year': '9998'}, {'name': 'AAA', 'gender': 'M', 'email': 'abcd@naver.com', 'year': '2020'}, {'name': 'DDDD', 'gender': 'F', 'email': 'sdfsdf@dsfasdf.asd', 'year': '5555'}, {'name': 'EXAMPLE', 'gender': 'M', 'email': 'example@gamil.com', 'year': '0000'}]

        다음 중에서 하실 작업의 메뉴를 입력하세요.
        I - 고객 정보 입력
        P - 이전 고객 정보 조회
        C - 현재 고객 정보 조회
        N - 다음 고객 정보 조회
        U - 현재 고객 정보 수정
        D - 현재 고객 정보 삭제
        S - 고객 정보 저장 
        Q - 프로그램 종료
    q
저장이 완료되었습니다.
안녕히가세요~

 

 

다음과 같이 정규식이 잘 적용된 것을 확인해 볼 수 있다.

이름, 성별, 출생년도도 정규식을 사용하면 더 고급진 프로그래밍이 될 것이다.


 

- 출처 : https://jw910911.tistory.com/90

728x90