본문 바로가기
개념정리

정규 표현식(regular expression, regex)

by 카뮤 2021. 1. 6.

정규식 표현식은 문자열 패턴을 가지고 기존 문자열과 일치하는 비교하는 것이다. 이메일,주민등록번호,우편번호,전화번호 등  특정 패턴 문자를을 추출할때 용이하다.

웹사이트에서 CTRL +F 로 특정 문자를 찾는 방법이 바로 정규 표현식이다.

 

 

표준 라이브러리인 re모듈을 Import한다.

import re  #정규식 표현식 라이브러리 import

 

Compile()

정규 표현식 사용법은

1) 찾고자 하는 문자열의 패턴을 정의하고

2) 정의된 패턴과 매칭되는 경우를 찾아 다양한 처리를 하는 2단계로 나누어집니다.
이중 1)에 해당하는 과정을 컴파일(compile)이라고 합니다.

아래는 위 두 단계에 대한 간략한 예시코드입니다.

#1단계 :  "the"라는 패턴을 컴파일한 후 패턴 객체를 리턴합니다. 
pattern = re.compile("the")    
​
# 2단계 : 컴파일된 패턴 객체를 활용하여 다른 텍스트에서 검색을 수행합니다.
pattern.findall('of the people, for the people, by the people')

#['the', 'the', 'the']

 

 

메소드

  • search() : 일치하는 패턴 찾기 * 일치 패턴이 있으면 MatchObject를 반환합니다.
  • match() : search()와 비슷하지만, 패턴이 검색대상에 처음부터 일치해야 합니다.
  • findall() : 일치하는 모든 패턴 찾기 * 모든 일치 패턴을 리스트에 담아서 반환합니다.
  • split() : 패턴으로 나누기
  • sub() : 일치하는 패턴으로 대체하기

 

 

아래는 search(), match() 등이 리턴하는 MatchObject가 가진 메소드입니다.

  • group() : 실제 결과에 해당하는 문자열을 반환합니다.
src = "My name is..."
regex = re.match("My", src)
if regex:
    print(regex.group())
else:
    print("No!")
    
    
#My

 

 

패턴 : 특수문자, 메타문자

 

패턴이야말로 정규 표현식을 강력하게 해주는 도구 인데요. 특수문자 혹은 메타문자라 불리는 []. -. . ? * + {} / 등을 이용해 특수한 패턴을 만들 수 있습니다. 자, 어떤 것들이 있는지 볼까요?

  • [ ] : 문자
  • - : 범위
  • . : 하나의 문자
  • ? : 0회 또는 1회 반복
  • * : 0회 이상 반복
  • + : 1회 이상 반복
  • {m, n} : m ~ n
  • \d : 숫자
  • \D : 비숫자
  • \w : 알파벳 문자
  • \W : 비알파벳 문자
  • \s : 공백 문자
  • \S : 비공백 문자
  • \b : 단어 경계
  • \B : 비 단어 경계

훑어만 보아도 이 많은 것들을 당장 외우기는 힘들어 보이네요. 그래서 이 중 몇 가지를 실습해 볼 예제를 준비해 보았습니다. 아래 실습을 통해 정규 표현식의 패턴들을 차근차근 익혀보도록 해요!

 

#- 연도(숫자)
text = """
The first season of America Premiere League  was played in 1993. 
The second season was played in 1995 in South Africa. 
Last season was played in 2019 and won by Chennai Super Kings (CSK).
CSK won the title in 2000 and 2002 as well.
Mumbai Indians (MI) has also won the title 3 times in 2013, 2015 and 2017.
"""
pattern = re.compile("[1-2]\d\d\d")
pattern.findall(text)

['1993', '1995', '2019', '2000', '2002', '2013', '2015', '2017']

 

 

#- 전화번호(숫자, 기호)
phonenumber = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d')
phone = phonenumber.search('This is my phone number 010-111-1111')
if phone:
  print(phone.group())
print('------')
phone = phonenumber.match ('This is my phone number 010-111-1111')
if phone:
  print(phone.group())

010-111-1111

------

 

#- 이메일(알파벳, 숫자, 기호)
text = "My e-mail adress is doingharu@aiffel.com, and tomorrow@aiffel.com"
pattern = re.compile("[0-9a-zA-Z]+@[0-9a-z]+\.[0-9a-z]+")
pattern.findall(text)

 

['doingharu@aiffel.com', 'tomorrow@aiffel.com']

 

 

구현 순서

위 예제들에서 정규 표현식을 구현한 순서를 그림과 함께 간단히 정리하고 넘어가 봅시다. 패턴들이 덜 익숙한 것 뿐 정규식의 구현 과정은 매우 간단한 것을 확인하실 수 있을 거에요.

  • import re 를 통해 정규식 모듈을 가져옵니다.
  • re.compile() 함수로 Regex 객체를 만듭니다.
  • 검색할 문자열을 Regex 객체의 search() , findall() 메소드로 전달합니다.

 

'개념정리' 카테고리의 다른 글

파이썬 리스트? 배열?  (0) 2021.01.09
디렉토리 관련 표준 라이브러리  (0) 2021.01.06
[퍼옴]리눅스 디렉토리 구조  (0) 2021.01.06
[파이썬]파일관련 함수  (0) 2021.01.06
인코딩과 디코딩이란?  (0) 2021.01.06

댓글