본문 바로가기
SW 개발/Python

Python 정규식(Regular Expression) re 모듈 사용법 및 예제

by Kibua20 2021. 7. 19.

정규식 표현식(Regular Expression)은  문자열을 처리하는 방법 중 하나로 "특정 조건 또는 패턴"을 치환하는 과정을 쉽게 처리할 수 있는 방법입니다.  Python에서 정규식 처리 모듈은 re 로, re 모듈에 대한 사용법과 예제를 설명하도록 하겠습니다.

 

정규식 re import

re를 사용하기 위해서는 import re를 선언하고, re 내부 함수와 pattern을 정의하여 호출합니다. 

 

import re

 

정규식 re 함수

Python에서  re 모듈에 대한 설명은 링크에 있고, 주요 함수는 다음과 같습니다. 

re 함수 설명 사용 예
re.compile(pattern, flags=0) 정규식 객체로 compile함
정규식 객체는 match()와 search()에 사용
prog = re.compile(pattern)
result = prog.match(string)

아래 코드와 동일
result = re.match(pattern, string)

re.search(pattern, string, flags=0) string을 스캔하여 정규식 pattern이 일치하는 첫번째 위치를 찾고, 객체를 반환

일치하는 결과가 없으면 None으로 반환
 
re.match(pattern, string, flags=0) string이 시작 부분에서 0개 이상의 문자가 pattern과 일치하면, 일치 객체를 반환  
re.fullmatch(pattern, string, flags=0) '전체' string이 정규식 pattern과 일치하면 객체를 반환  
re.split(pattern, string, maxsplit=0, flags=0) string을 pattern으로 분리 re.split('[a-f]+', '0a3B9', flags=re.IGNORECASE)
['0', '3', '9']
re.findall(pattern, string, flags=0) string에서 겹치지 않는 pattern의 모든 일치를 문자열 리스트로 반환  
re.finditer(pattern, string, flags=0) string에서 겹치지 않는 RE pattern의 모든 일치를 일치 객체를 산출하는  iterator로 반환합니다  
re.sub(pattern, repl, string, count=0, flags=0) string에서 겹치지 않는 pattern의 가장 왼쪽 일치를 repl로 치환하여 얻은 문자열을 반환 re.sub('[^A-Za-z0-9]''', ‘(Hello123)’) 
→ Hello123 (문자, 숫자가 아닌 부분을 ''로 대체)
re.subn(pattern, repl, string, count=0, flags=0)  re.sub() 동일하지만, (new_string, number of_subs_made)형태로 반환  
re.escape(pattern) pattern에서 특수 문자를 이스케이프 처리 re.escape('http://www.python.org')
→  http://www\.python\.org
re.purge() 정규식 cache를 삭제  

 

 

정규 표현식 (Regular Expression)

자주 사용하는 정규 표현식은 다음과 같습니다.  re 모듈 사용 시 pattern에 해당하는 값입니다.

정규 표현식 축약 표현 의미
[0-9] \d 숫자를 찾음
[^0-9] \D ^는 not을 의미. 즉 not [0-9] 이며,   숫자가 아닌 것을 찾음
[ \t\n\r\f\v] \s 제어 문자(개행 문자, 탭 문자, 스페이스) 문자인 것을 찾음
[^ \t\n\r\f\v] \S 제어 문자가 '아닌' 경우
[A-Za-z0-9] \w 문자, 숫자를 찾음
[^A-Za-z0-9] \W 문자, 숫자가 '아닌' 것을 찾음
dot . 개행 문자를 제외한 문자를 찾음.  [^\n\r]과 동일한 의미
[ABC]   특정 문자(ABC)를 찾음
반복 ? ? 앞 문자가 0번 또는 1번 표시되는 패턴
반복 * * 앞 문자가 0번 또는 그 이상 반복되는 패턴
반복 + + 앞 문자가 1번 또는 그 이상 반복되는 패턴
반복 $ $ 문자열의 끝이나 문자열 끝의 개행 문자 바로 직전과 일치하고, MULTILINE 모드에서는 개행 문자 앞에서도 일치
\ \ 특수 문자를 이스케이프 하거나 ('*', '?' 등의 문자를 일치시킬 수 있도록 합니다), 특수 시퀀스를 알림
{n}   앞 문자가 n번 반복되는 패턴
{m,n}   앞 문자가 m번 반복되는 패턴부터 n번 반복되는 패턴

 

정규 표현식 (Regular Expression) 예제

정규식에 대한 설명은 Test는 아래 사이트에서 확인이 가능합니다. 정규식을 실무에서 활용하기 위해서는 예제를 많이 참고하는 것이 도움이 됩니다. 아래 다양한 예제와 실행 결과를 참고하세요. 

 

Python test code는 Git Hub https://github.com/kibua20/devDocs/tree/master/reglar_expression 에 반영했습니다.

 

Regular Expression Python sample code

#!/usr/bin/python3
# -*- coding: utf-8 -*-

import re

string = 'The Regular Expresion !!! 123 @#! 한글'

# 소문자만, +는 1번 이상 반복
pattern = re.compile('[a-z]+')
print(pattern.findall(string))
# 결과: ['he', 'egular', 'xpresion']


# 소문자만, ?는 0번 또는 1번 이상 표시
pattern = re.compile('[a-z]?')
print(pattern.findall(string))
# 결과: ['', 'h', 'e', '', '', 'e', 'g', 'u', 'l', 'a', 'r', '', '', 'x', 'p', 'r', 'e', 's', 'i', 'o', 'n', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']


# 소문자만, *는 0번 또는 그 이상 표시
pattern = re.compile('[a-z]*')
print(pattern.findall(string))
# 결과: ['', 'he', '', '', 'egular', '', '', 'xpresion', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']


# 소문자, 대문자, 숫자, +는 1번 이상 반복
pattern = re.compile('[a-zA-Z0-1]+')
print(pattern.findall(string))
# 결과: ['The', 'Regular', 'Expresion', '1']


# 소문자, 대문자, 숫자, ?는 0번 또는 1번 이상 표시
pattern = re.compile('[a-zA-Z0-1]?')
print(pattern.findall(string))
# 결과: ['T', 'h', 'e', '', 'R', 'e', 'g', 'u', 'l', 'a', 'r', '', 'E', 'x', 'p', 'r', 'e', 's', 'i', 'o', 'n', '', '', '', '', '', '1', '', '', '', '', '', '', '', '', '', '']


# 소문자, 대문자, 숫자, *는 0번 또는 그 이상 표시
pattern = re.compile('[a-zA-Z0-1]*')
print(pattern.findall(string))
# 결과: ['The', '', 'Regular', '', 'Expresion', '', '', '', '', '', '1', '', '', '', '', '', '', '', '', '', '']


# 주민번호 뒷 번호를 *******로 치환
string = '090320-3212345'
# 기호 '-'와 0~9까지의 숫자 7개 반복의 패턴 정의
pattern = '-[0-9]{7}'
#  sub(정규표현식, 바꿀문자열, 입력문자열)
print ( re.sub(pattern, '-*******', string) )
# 결과: 090320-*******


#split 예제
pattern = re.compile(':')
print ( pattern.split('key:value') )
# 결과: ['key', 'value'] 


string = """Ross McFluff: 834.345.1254 155 Elm Street
Ronald Heathmore: 892.345.3428 436 Finley Avenue
Frank Burger: 925.541.7625 662 South Dogwood Way
Heather Albrecht: 548.326.4584 919 Park Place"""


entries = re.split("\n+", string)
print (entries)
# 결과: 개행 문자를 기준으로 분리한 문자열 4개의 list 
# ['Ross McFluff: 834.345.1254 155 Elm Street', 
# 'Ronald Heathmore: 892.345.3428 436 Finley Avenue', 
# 'Frank Burger: 925.541.7625 662 South Dogwood Way', 
# 'Heather Albrecht: 548.326.4584 919 Park Place']

# :와 ' ' 공백(space)을 패턴으로 4개의 list로 분리
result = [re.split(":? ", entry, maxsplit=4) for entry in entries]
print (result)
# 결과:  성, 이름, 전화번호, 우편번호, 거리명 list 저장됨
# [
#    ['Ross', 'McFluff', '834.345.1254', '155', 'Elm Street'], 
#    ['Ronald', 'Heathmore', '892.345.3428', '436', 'Finley Avenue'], 
#    ['Frank', 'Burger', '925.541.7625', '662', 'South Dogwood Way'], 
#    ['Heather', 'Albrecht', '548.326.4584', '919', 'Park Place']
# ]

 

 

관련 글:

[SW 개발/Data 분석 (RDB, NoSQL, Dataframe)] - Python KoNLPy와 WordCloud를 활용하여 WordCloud 생성하기 (Sample code 포함)

[SW 개발/Python] - Python: JSON 개념과 json 모듈 사용법

[SW 개발/Python] - Python으로 개행 문자(\n)가 포함된 JSON 읽기: JSONDecodeError 수정하기

[SW 개발/Data 분석 (RDB, NoSQL, Dataframe)] - Python Selenium과 BeautifulSoup을 활용하여 Google PlayStore 사용자 리뷰 (댓글) 가져오기 (Sample Code 포함)

[SW 개발/Data 분석 (RDB, NoSQL, Dataframe)] - Apple App Store 사용자 댓글(리뷰) 데이터 수집하기 (Sample code 포함)

[SW 개발/Data 분석 (RDB, NoSQL, Dataframe)] - Dataframe(또는 Numpy)를 JSON 출력 시 에러: TypeError: Object of type int64 is not JSON serializable

[SW 개발/Data 분석 (RDB, NoSQL, Dataframe)] - Jupyter Notebook의 업그레이드: Jupyter Lab 설치 및 extension 사용법

[SW 개발/Python] - Python 음수 인덱스: line.split('+')[-1] 또는 line.split('/')[-1] 의미

[SW 개발/Data 분석 (RDB, NoSQL, Dataframe)] - Dataframe(또는 Numpy)를 JSON 출력 시 에러: TypeError: Object of type int64 is not JSON serializable

[블로그 관리/티스토리 블로그 관리] - 파이썬 Selenium을 활용한 네이버 서치어드바이저 URL 입력 '자동화'




댓글