RAG

패스트캠퍼스 환급챌린지 50일차 : 테디노트의 RAG 비법노트 강의 후기

Sssadie 2025. 12. 31. 22:23
반응형

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.

 

정규 표현식(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

 

 

반응형