정규 표현식(Regular Expression)은 특정한 패턴을 가진 문자열을 검색하고, 추출하고, 수정하는 데 사용되는 강력한 도구입니다.
파이썬에서는 re
모듈을 통해 정규 표현식을 다룰 수 있습니다.
이번 글에서는 정규 표현식의 기본 문법과 함께 파이썬에서 텍스트 데이터를 처리하는 다양한 방법을 예제와 함께 살펴보겠습니다.
1. 정규 표현식 기본 문법
정규 표현식에서 특정 패턴을 표현하기 위해 사용하는 특수 기호와 문법이 있습니다. 자주 사용하는 주요 패턴을 살펴보겠습니다.
주요 패턴
.
: 임의의 문자 하나를 의미^
: 문자열의 시작을 의미$
: 문자열의 끝을 의미*
: 0회 이상 반복+
: 1회 이상 반복?
: 0회 또는 1회 반복[]
: 문자 클래스, 대괄호 안에 있는 문자 중 하나와 매칭{n}
: n회 반복|
: OR 연산 (여러 패턴 중 하나)\d
: 숫자와 매칭\w
: 문자와 숫자 및 밑줄과 매칭\s
: 공백 문자와 매칭
예제: 정규 표현식 기본 패턴
import re
text = "Hello, 123 world!"
# 숫자 찾기
result = re.findall(r"\d+", text)
print(result) # ['123']
# 단어 찾기
result = re.findall(r"\w+", text)
print(result) # ['Hello', '123', 'world']
위 코드에서 \d+
는 하나 이상의 숫자, \w+
는 단어와 매칭됩니다.
2. re 모듈 주요 함수
re
모듈에서는 정규 표현식을 활용할 수 있는 여러 가지 함수가 제공됩니다. 그중에서 자주 사용되는 함수는 search()
, match()
, findall()
, sub()
등이 있습니다.
2.1 search() 함수
search()
함수는 문자열에서 패턴과 일치하는 첫 번째 위치를 찾아 매치 객체를 반환합니다. 패턴이 일치하지 않으면 None
을 반환합니다.
예제: search() 함수 사용하기
text = "My email is example@example.com"
result = re.search(r"\w+@\w+\.\w+", text)
if result:
print("이메일 주소:", result.group()) # 이메일 주소: example@example.com
2.2 match() 함수
match()
함수는 문자열의 시작 부분에서 패턴과 일치하는지 확인합니다. 문자열의 첫 부분이 패턴과 일치하지 않으면 None
을 반환합니다.
예제: match() 함수 사용하기
text = "Python is fun"
result = re.match(r"Python", text)
if result:
print("매칭 성공:", result.group()) # 매칭 성공: Python
2.3 findall() 함수
findall()
함수는 문자열에서 패턴과 일치하는 모든 항목을 찾아 리스트로 반환합니다.
예제: findall() 함수 사용하기
text = "Phone numbers: 010-1234-5678, 02-9876-5432"
result = re.findall(r"\d{2,3}-\d{3,4}-\d{4}", text)
print("전화번호 목록:", result) # 전화번호 목록: ['010-1234-5678', '02-9876-5432']
위 코드에서는 모든 전화번호를 리스트로 추출합니다.
2.4 sub() 함수
sub()
함수는 패턴과 일치하는 부분을 다른 문자열로 대체합니다.
예제: sub() 함수 사용하기
text = "My phone number is 010-1234-5678"
result = re.sub(r"\d{2,3}-\d{3,4}-\d{4}", "XXX-XXXX-XXXX", text)
print(result) # My phone number is XXX-XXXX-XXXX
위 코드에서는 전화번호를 특정 패턴인 XXX-XXXX-XXXX
로 대체합니다.
3. 그룹(Group) 사용하기
정규 표현식에서 소괄호 ()
를 사용하여 패턴을 그룹으로 묶을 수 있습니다. 그룹을 사용하면 일치하는 부분을 세분화하여 추출할 수 있습니다.
예제: 그룹 사용하기
text = "My email is example@example.com"
result = re.search(r"(\w+)@(\w+)\.(\w+)", text)
if result:
print("전체 이메일:", result.group(0)) # example@example.com
print("사용자명:", result.group(1)) # example
print("도메인:", result.group(2)) # example
print("최상위 도메인:", result.group(3)) # com
위 코드에서는 그룹을 통해 이메일 주소를 세분화하여 각 부분을 추출할 수 있습니다.
4. 정규 표현식 플래그
정규 표현식 플래그를 사용하면 검색 방식을 제어할 수 있습니다. 대표적인 플래그로는 re.IGNORECASE
(대소문자 구분 없음), re.MULTILINE
(여러 줄 모드) 등이 있습니다.
예제: re.IGNORECASE 플래그 사용하기
text = "Python is fun. python is easy."
result = re.findall(r"python", text, re.IGNORECASE)
print(result) # ['Python', 'python']
위 코드에서 IGNORECASE
플래그를 사용하여 대소문자와 관계없이 python
을 찾습니다.
5. 복잡한 패턴 예제
정규 표현식을 통해 더 복잡한 패턴도 검색하고 처리할 수 있습니다. 예를 들어, 웹 주소를 추출하는 패턴을 작성할 수 있습니다.
예제: URL 추출하기
text = "Visit us at https://www.example.com or http://example.org"
urls = re.findall(r"https?://[a-zA-Z0-9.-]+", text)
print("추출된 URL:", urls) # ['https://www.example.com', 'http://example.org']
위 코드에서는 https
나 http
로 시작하는 웹 주소를 추출합니다.
마무리
이번 글에서는 파이썬 정규 표현식의 기초 개념과 re
모듈을 활용한 텍스트 데이터 처리 방법을 알아보았습니다.
정규 표현식을 잘 활용하면 텍스트에서 원하는 데이터를 손쉽게 추출하고 가공할 수 있습니다.
실습을 통해 정규 표현식에 익숙해져 보세요!