소개
정규 표현식(Regular Expression, 줄여서 RegEx)은 프로그래밍을 조금이라도 해본 사람이라면 한 번쯤 들어봤을 개념입니다. 정규 표현식은 문자열을 검색하거나 치환할 때 사용되며, 다양한 텍스트 편집기, 검색 엔진, 워드 프로세서 등 폭넓게 활용되고 있습니다.
쉽게 말해, 정규 표현식은 찾고자 하는 특정 패턴과 문자열이 일치하는지 확인하는 데 도움을 줍니다.
대표적인 예로 대학교 웹사이트를 들 수 있습니다. 회원가입 시 학교 이메일 주소만 허용하고 다른 도메인은 받지 않도록 제한하는 기능이 바로 정규 표현식으로 구현된 것입니다.
시작하기
정규 표현식 모듈(re)은 Python에 기본으로 포함되어 있으므로 별도로 다운로드하거나 설치할 필요가 없습니다.
모듈의 기능을 사용하려면 먼저 임포트해야 합니다. 다음과 같이 임포트합니다.
import re
주요 함수 살펴보기
re 모듈에는 다양한 함수가 포함되어 있으며, 각 함수의 차이를 정확히 이해하는 것이 중요합니다.
아래는 Python 프로젝트를 진행할 때 반드시 접하게 될 핵심 함수들입니다.
re.compile(pattern, flags) # 패턴을 컴파일하여 매칭 준비 re.search(pattern, string, flags) # 문자열 전체에서 패턴과 일치하는 부분 검색 re.match(pattern, string, flags) # 문자열이 패턴과 일치하는지 확인 re.split(pattern, string, max, flag) # 지정한 패턴을 기준으로 문자열 분리 re.findall(pattern, string, flag) # 패턴과 일치하는 모든 결과 출력 re.finditer(pattern, string, flags) # 일치 결과를 반복 가능한(iterable) 객체로 반환 re.sub(pattern, repl, string, count) # 패턴에 일치하는 부분을 다른 문자열로 교체 re.subn(pattern, repl, string, count) # re.sub와 동일하지만 (문자열, 교체 횟수) 튜플 반환 re.escape(pattern) # ASCII 문자 외의 모든 특수 문자를 이스케이프 처리
re.compile과 re.match 함수
"Hello world"라는 문자열이 "Hello world! How are things going?"이라는 문자열 안에 존재하는지 확인해 보겠습니다.
이 작업에는 re.compile과 re.match 함수를 사용합니다.
x = re.compile("Hello world")
y = x.match("Hello world! How are things going?")
if (y):
print("Strings match")
else:
print("Strings do not match")실행 결과
Strings match
"compile 함수 없이도 할 수 있지 않나?"라고 생각하신다면 정답입니다! 실제로 compile 함수 없이도 동일한 작업을 수행할 수 있습니다.
x = re.match("Hello world", "Hello world! How are things going?")
if (y):
print("Strings match")
else:
print("Strings do not match")실행 결과
Strings match
다만, 동일한 패턴을 여러 번 재사용하는 경우 re.compile로 미리 컴파일해 두면 코드 재사용성과 성능 면에서 유리합니다.
re.split 함수
x = re.split("\W+", "Hello,World")
print(x)
x = re.split("(\W+)", "Hello,World")
print(x)실행 결과
['Hello', 'World'] ['Hello', ',', 'World']
위 예제에서 "\W+"는 왼쪽부터 분리를 시작하라는 의미이며, + 기호는 문자열 끝까지 계속 진행하라는 뜻입니다. 두 번째 예제처럼 패턴을 괄호로 묶으면 분리 기준이 된 문장부호(예: 쉼표)도 결과에 함께 포함됩니다.
re.sub와 re.subn 함수
x = re.sub(r"there", "World", "Hello there. Python is fun.") print(x) x = re.subn(r"there", "World", "Hello there. Python is fun. Hello there") print(x)
실행 결과
Hello World. Python is fun.
('Hello World. Python is fun. Hello World', 2)위 예제에서 re.sub는 문자열에 "there"라는 단어가 있는지 확인하고, 있다면 "World"로 교체합니다.
subn 함수도 동일한 작업을 수행하지만, 문자열 대신 튜플을 반환하며 수행된 총 교체 횟수도 함께 알려줍니다.
실전 예제: 비밀번호 유효성 검사
정규 표현식의 대표적인 실무 활용 사례 중 하나는 비밀번호 유효성 검사입니다.
import re
matching_sequence = r"[0-9]"
while(True):
x = input("Enter your password : ")
r = re.search(matching_sequence, x)
if (r and len(x)>6):
print(x + " is a valid password")
else:
print(x + " is not a valid password. Password MUST be atleast 7 characters with atleast 1 number")
input("Press Enter key to exit ")이 프로그램은 입력한 비밀번호가 유효한지, 즉 7자 이상이면서 숫자를 최소 1개 포함하고 있는지 확인합니다.
마무리
지금까지 Python의 re 모듈 기초와 모듈 내에서 사용할 수 있는 다양한 함수들을 살펴보았습니다.
re 모듈에는 이 외에도 더 많은 함수와 활용법이 있습니다. 관심이 있다면 공식 문서(https://docs.python.org/3/library/re.html)에서 자세한 내용을 확인할 수 있습니다.