본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.
정규 표현식(Regular Expression)
- 텍스트에서 일치되는 패턴을 찾는 문자열을 표현하는 방식
- 문자열을 찾거나, 바꾸는 데에 활용
- 문자열의 정합성 검증에 사용 - 파이썬의 경우, 표준 라이브러리인 re를 이용
정규 표현식의 활용 예
- 이 소설책에 주인공 이름이 몇 번 나타나나요?
- 주어진 문장에서 전화번호만 추출하고 싶어요.
- 입력 받은 텍스트가 이메일 주소 양식이 맞나요?
- 어떤 규칙을 갖는 텍스트 앞 뒤로 어떤 단어가 있는지 궁금해요.
- 주민등록번호 7자리를 yyyy-mm-dd 형태의 생일로 변경하고 싶어요.
- 로그파일을 분석해서 중대한 결함이 발견되면 메일로 알람을 보내고 싶어요.
파이썬의 정규 표현식 : re패키지
정규 표현식의 기본 개념
- 메타 문자 : 패턴의 구조를 정의하는 데에 사용
- 특수 문자 : 개행, 탭, 문자 또는 숫자를 의미하는 등 사전에 정의된 특수 문자
- 문자 집합 : 여러 문자와 매칭되는 패턴. 예를 들어, [aeiou]는 소문자 모음 한 글자를 의미
- 반복자 : 패턴의 일부 또는 전체가 반복되는 것을 나타냄. *은 0회 이상, +는 1회 이상
- 그룹화 : 패턴의 일부를 그룹화하여, 반복자를 사용하거나 매치된 부분을 추출하는데 사용
정규표현식을 통한 탐색
- re.search(pattern, string, flags=0): string에서 pattern이 일치하는 첫 번째 매치를 반환
- re.match(pattern, string, flags=0): string의 시작 부분에서부터 pattern이 일치하면 해당 매치를 반환
- re.fullmatch(pattern, string, flags=0): 전체 string이 정규식 패턴과 일치하면 그 매치를 반환
- re.findall(pattern, string, flags=0): string에서 매치되는 모든 결과를 문자열 또는 튜플 형태로 반환
정규 표현식을 통한 수정
- re.sub(pattern, repl, string, count=0, flags=0)
- pattern: 찾고자 하는 정규 표현식 패턴
- repl: 패턴과 매치된 부분을 대체할 문자열
- string: 대상이 되는 전체 문자열
- count: 치환할 최대 횟수. 기본값은 0으로, 0인 경우 모든 매치를 치환함
- flags: 특수 조건 flags
정규식 객체(re.Pattern)
- 정규식 객체 만들기: re.compile(pattern, flags=0)
- 하나의 정규식이 단일 프로그램 내에서 여러 번 사용될 때, compile을 통해 정규식 객체를 재사용하는 것이 보다 효율적
- 정규식 객체 생성 시 flags를 적용할 수 있음
매치 객체(re.Match)
- search 및 match의 결과가 저장되는 객체
- 일치하는 값이 있을 때는 반드시 True를 값으로 가짐(이외에는 None)
- if re.search(pattern, string): - 괄호를 통해 그룹을 지정하고, 특정 위치의 그룹을 가져올 수 있음: Match.group()
- 매치의 위치 (시작, 끝, span) 값을 다양하게 활용
- Match.start(), Match.end(), ...
정규 표현식 활용법: 핸드폰 번호 추출하기
- 주어진 개인 정보에서 핸드폰 번호 패턴을 정의하고, 이를 추출한다.
- 한국 전화번호의 경우 01x-xxxx-xxxx 형태의 규칙을 가짐
import re
phone_number_pattern = re.compile(r'01[016789]-\d{4}-\d{4}')
personal_info = """
이름: 홍길동
주소: 서울시 강남구
전화번호: 010-1234-5678
주민등록번호: 930101-1234567
"""
match = phone_number_pattern.search(personal_info)
if match:
print(f"핸드폰 번호: {match.group()}")
정규표현식은 처음에 배울 때 복잡한 기호들의 조합이 어렵게 느껴졌어요. \d, *, +, [] 같은 메타 문자들이 어떤 상황에서 어떻게 쓰이는지 혼란스럽죠. 하지만 이 패턴들을 이해하고 나면, 텍스트 처리에서 정말 강력한 도구가 된다는 걸 깨달을 수 있어요!
RAG 시스템을 구축할 때 정규 표현식은 생각보다 자주 사용되더라고요. 특히, 대량의 문서를 처리하기 전에 데이터를 정제하는 단계에서요.
전처리 단계에서 활용되는 사례를 찾아보면, 다음과 같이 정리해 볼 수 있죠.
- 문서에서 이메일 주소, URL, 전화번호 같은 특정 패턴 추출
- 불필요한 특수문자나 HTML 태그 제거
- 날짜, 시간 같은 구조화된 정보 통일된 형식으로 변환
- 문장 분리나 청킹 작업 시 구분자 찾기
예를 들어, 법률 문서나 의료 기록처럼 민감한 정보가 포함된 문서를 RAG에 활용할 때, 개인정보를 마스킹하거나 제거하는 작업이 필수죠. 이때 정규표현식을 활용하면 효율적으로 처리할 수 있어요.
정규표현식과 단순문자열 처리를 간단한 예시로 표현해볼게요.
[일반적인 문자열 처리]
# 전화번호 찾기 - 비효율적
text = "연락처: 010-1234-5678, 02-9876-5432"
if "010-" in text:
# 전화번호 추출 로직 작성... 복잡함
pass
[정규 표현식 사용]
# 전화번호 찾기 - 효율적
import re
text = "연락처: 010-1234-5678, 02-9876-5432"
phone_numbers = re.findall(r'01[016789]-\d{4}-\d{4}', text)
# ['010-1234-5678']
정규 표현식은 한 줄로 복잡한 패턴을 정의하고 찾을 수 있어요. 특히 여러 형식이 섞여 있는 비정형 텍스트에서 특정 패턴을 찾을 때 그 진가가 드러나요.
'정규 표현식'을 처음에 접했을 때는, 괜히 더 복잡하고 헷갈리게 느껴졌는데...실제로 활용해보면 텍스트 처리 효율을 몇 배로 높여줘서 아주 유용해요. 특히 RAG 시스템처럼 대량읨 텍스트 데이터를 다루는 프로젝트에서는 필수적으로 익혀둬야 하는 기술이라고 생각해요.
이제 이 챌린지도 끝났어요. 2025년도 끝났고...Happy한 일만 가득한 New Year이길 바라봅니다!!! 취준 끝!! 제발~!!!!
다들 새해 복 많이 받으세요!!




커리어 성장을 위한 최고의 실무교육 아카데미 | 패스트캠퍼스
성인 교육 서비스 기업, 패스트캠퍼스는 개인과 조직의 실질적인 '업(業)'의 성장을 돕고자 모든 종류의 교육 콘텐츠 서비스를 제공하는 대한민국 No. 1 교육 서비스 회사입니다.
fastcampus.co.kr
'RAG' 카테고리의 다른 글
| 패스트캠퍼스 환급챌린지 49일차 : 테디노트의 RAG 비법노트 강의 후기 (0) | 2025.12.30 |
|---|---|
| 패스트캠퍼스 환급챌린지 48일차 : 테디노트의 RAG 비법노트 강의 후기 (0) | 2025.12.29 |
| 패스트캠퍼스 환급챌린지 47일차 : 테디노트의 RAG 비법노트 강의 후기 (0) | 2025.12.28 |
| 패스트캠퍼스 환급챌린지 46일차 : 테디노트의 RAG 비법노트 강의 후기 (0) | 2025.12.27 |
| 패스트캠퍼스 환급챌린지 45일차 : 테디노트의 RAG 비법노트 강의 후기 (0) | 2025.12.26 |