정규 표현식(Regular Expression, Regex)은 주어진 문자열 안에 특정 패턴이 존재하는지 확인하기 위해 사용되는 일종의 미니 프로그래밍 언어입니다. 문자열에서 원하는 검색 패턴이 있는지 검사하는 도구로, 데이터 전처리, 입력값 유효성 검사, 텍스트 추출 및 치환 등 실무에서 폭넓게 활용됩니다.
1. re 모듈 불러오기
파이썬은 정규 표현식을 위한 내장 패키지인 re 모듈을 기본 제공합니다. 별도 설치 없이 아래 한 줄만 추가하면 바로 사용할 수 있습니다.
import re
가장 기본적인 매칭 예제
import re
txt = "Use of python in Machine Learning"
x = re.search("^Use.*Learning$", txt)
if x:
print("YES! We have a match!")
else:
print("No match")
실행 결과
YES! We have a match!
위 코드는 문자열이 "Use"로 시작하고(^) "Learning"으로 끝나는($)지를 검사하는 예제입니다. 조건에 맞으면 매치 객체가 반환되어 if 문이 참이 됩니다.
2. re 모듈의 주요 함수
re 모듈은 문자열에서 패턴과 일치하는 부분을 찾기 위한 다양한 함수를 제공합니다.
| 함수 | 설명 |
|---|---|
| findall() | 일치하는 모든 결과를 리스트로 반환 |
| search() | 문자열 어디든 일치하는 부분이 있으면 매치 객체를 반환 |
| split() | 일치하는 지점마다 문자열을 나누어 리스트로 반환 |
| sub() | 일치하는 하나 이상의 부분을 지정한 문자열로 교체 |
3. 메타 문자(Metacharacters)
메타 문자는 정규 표현식 안에서 특별한 의미를 가지는 문자들입니다.
| 문자 | 설명 | 예제 |
|---|---|---|
| [] | 문자 집합 | "[a-m]" |
| \ | 특수 시퀀스를 알리거나 특수 문자를 이스케이프 | "\d" |
| . | 줄바꿈 문자를 제외한 임의의 한 문자 | "he..o" |
| ^ | 해당 문자열로 시작 | "^Hello" |
| $ | 해당 문자열로 끝남 | "World$" |
| * | 0번 이상 반복 | "aix*" |
| + | 1번 이상 반복 | "aix+" |
| {} | 정확히 지정한 횟수만큼 반복 | "ai{2}" |
| | | 둘 중 하나(또는) | "short|long" |
| () | 캡처하고 그룹화 | - |
4. 특수 시퀀스(Special Sequences)
특수 시퀀스는 백슬래시(\) 뒤에 아래 문자 중 하나가 붙은 형태로, 역시 특별한 의미를 가집니다.
| 문자 | 설명 | 예제 |
|---|---|---|
| \A | 지정한 문자가 문자열 맨 앞에 있으면 일치 | "\APyt" |
| \b | 지정한 문자가 단어의 시작 또는 끝에 있으면 일치 | r"\bPython", r"world\b" |
| \B | 지정한 문자가 단어의 시작(또는 끝)이 아닌 위치에 있으면 일치 | r"\BPython", r"World\B" |
| \d | 숫자(digit)가 포함되어 있으면 일치 | "\d" |
| \D | 숫자가 아닌 문자가 포함되어 있으면 일치 | "\D" |
| \s | 공백 문자가 포함되어 있으면 일치 | "\s" |
| \S | 공백이 아닌 문자가 포함되어 있으면 일치 | "\S" |
| \w | 영문자(a~z, A~Z), 숫자(0~9), 밑줄(_) 중 하나라도 포함되면 일치 | "\w" |
| \W | 단어 문자가 아닌 것이 포함되어 있으면 일치 | "\W" |
| \Z | 지정한 문자가 문자열 맨 끝에 있으면 일치 | "world\Z" |
참고로 \b처럼 백슬래시가 포함된 패턴은 문자열 앞에 r을 붙인 로우 스트링(raw string)으로 작성하는 것이 좋습니다. 그래야 파이썬의 이스케이프 처리와 충돌하지 않습니다.
5. 셋(Sets)
대괄호 []로 묶인 문자 집합 역시 특별한 의미를 가집니다.
| 셋 | 설명 |
|---|---|
| [raj] | r, a, j 중 하나라도 포함되면 일치 |
| [a-r] | a부터 r 사이의 알파벳 소문자와 일치 |
| [^raj] | r, a, j를 제외한 모든 문자와 일치 |
| [0123] | 0, 1, 2, 3 중 하나라도 포함되면 일치 |
| [0-9] | 0부터 9 사이의 숫자와 일치 |
| [0-3][0-8] | 00부터 38 사이의 두 자리 숫자와 일치 |
| [a-zA-Z] | a~z 또는 A~Z 사이의 알파벳 문자와 일치 |
| [+] | 문자열에서 + 문자와 일치 |
6. findall() 함수 예제
findall() 함수는 일치하는 모든 결과를 리스트로 반환합니다.
# 텍스트에서 "in"과 일치하는 모든 항목을 리스트로 출력
import re
txt = "Use of python in Machine Learning"
x = re.findall("in", txt)
print(x)
실행 결과
['in', 'in', 'in']
결과 리스트에는 발견된 순서대로 모든 일치 항목이 담깁니다. 만약 일치하는 패턴이 하나도 없다면 빈 리스트가 반환됩니다.
x = re.findall("Hello", txt) # 텍스트에 없는 패턴
실행 결과
[]
7. search() 함수 예제
search() 함수는 문자열 전체를 검색하여 일치하는 부분이 있으면 매치 객체를 반환합니다. 일치하는 부분이 여러 개여도 첫 번째 항목만 반환한다는 점에 유의하세요.
import re
txt = "Python is one of the most popular languages around the world"
searchObj = re.search("\s", txt)
print("첫 번째 공백 문자의 위치:", searchObj.start())
실행 결과
첫 번째 공백 문자의 위치: 6
일치하는 패턴이 없으면 None이 반환됩니다.
8. split() 함수 예제
split() 함수는 일치하는 지점마다 문자열을 잘라 리스트로 반환합니다.
# 공백 문자를 기준으로 문자열 분리
import re
string = "Python is one of the most popular languages around the world"
result = re.split("\s", string)
print(result)
실행 결과
['Python', 'is', 'one', 'of', 'the', 'most', 'popular', 'languages', 'around', 'the', 'world']
9. sub() 함수 예제
sub() 함수는 일치하는 부분을 원하는 텍스트로 교체할 때 사용합니다.
# 문자열의 모든 공백을 밑줄(_)로 교체
import re
string = "Python is one of the most popular language around the world"
result = re.sub("\s", "_", string)
print(result)
실행 결과
Python_is_one_of_the_most_popular_language_around_the_world
10. 매치 객체(Match Object)
매치 객체는 검색 결과와 관련된 정보를 담고 있는 객체입니다. 일치하는 패턴이 없으면 None이 반환됩니다.
import re
string = "Python is one of the most popular language around the world"
searchObj = re.search("on", string)
print(searchObj)
실행 결과
<re.Match object; span=(4, 6), match='on'>
매치 객체는 검색 정보를 조회할 수 있는 속성과 메서드를 제공합니다.
- .span() – 일치 구간의 시작 위치와 끝 위치를 튜플로 반환
- .string – 함수에 전달된 원본 문자열을 반환
- .group() – 실제로 일치한 문자열 부분을 반환
예제 – 대문자 "P"로 시작하는 단어를 찾아 일치한 부분 출력하기
# 대문자 P로 시작하는 단어 검색
import re
string = "Python is one of the most popular language around the world"
searchObj = re.search(r"\bP\w+", string)
print(searchObj.group())
실행 결과
<re.Match object; span=(0, 6), match='Python'>
이처럼 파이썬의 re 모듈만 익혀두면 복잡한 문자열 처리 작업도 몇 줄의 코드로 깔끔하게 해결할 수 있습니다. 메타 문자와 특수 시퀀스를 자유롭게 조합하며 다양한 패턴 매칭을 직접 연습해 보세요.