어제 오늘 내일

[Python] "원하는 데이터만 쏙쏙!" 파이썬 정규표현식(Regex) 기초 완벽 가이드 본문

IT/Python

[Python] "원하는 데이터만 쏙쏙!" 파이썬 정규표현식(Regex) 기초 완벽 가이드

hi.anna 2026. 4. 17. 01:43

정규표현식(Regex)은 특정한 규칙을 가진 문자열의 집합을 표현하는 '형식 언어'입니다. 처음 보면 마치 외계어처럼 생겼지만, 원리만 알면 수백 줄의 코드를 단 한 줄로 줄여주는 기적을 경험할 수 있습니다.

파이썬에서는 기본으로 제공하는 re 모듈을 가져와서 사용합니다.


1. 정규표현식의 핵심 기호 (마법의 주문)

정규표현식은 '패턴'을 만드는 것입니다. "숫자 3개, 하이픈(-), 숫자 4개" 같은 규칙을 기호로 표현합니다. 실무에서 가장 많이 쓰는 핵심 기호만 빠르게 훑어보겠습니다.

  • \d : 숫자 (Digit, 0~9)
  • \w : 문자+숫자 (Word, 알파벳, 한글, 숫자 등)
  • \s : 공백 (Space, 띄어쓰기, 탭 등)
  • + : 앞의 문자가 1번 이상 반복됨 (예: \d+ = 숫자가 1개 이상 있음)
  • * : 앞의 문자가 0번 이상 반복됨 (없을 수도 있음)
  • {n} : 정확히 n번 반복됨 (예: \d{3} = 숫자가 정확히 3개)
  • [ ] : 괄호 안의 문자 중 하나 (예: [a-z] = 소문자 a부터 z까지 중 하나)

이 기호들을 레고 블록처럼 조립해서 우리가 원하는 패턴을 만듭니다.


2. 숨은 데이터 싹 다 찾기: re.findall()

수백 장의 텍스트 문서 안에서 전화번호(010-XXXX-XXXX) 패턴만 전부 찾아내서 리스트로 만들어주는 기능입니다.

📌 예제 코드: 텍스트에서 전화번호만 추출하기

import re  # 정규표현식 모듈을 불러옵니다.

text = """
안녕하세요, 홍길동입니다. 제 번호는 010-1234-5678입니다.
급한 일은 010-9876-5432로 연락 주세요.
사무실 번호 02-111-2222는 당분간 안 받습니다.
"""

# 패턴 만들기: 숫자 3개 + 하이픈(-) + 숫자 3~4개 + 하이픈(-) + 숫자 4개
# \d{3} : 숫자 3개
# \d{3,4} : 숫자 3개 또는 4개
phone_pattern = r"\d{3}-\d{3,4}-\d{4}"

# re.findall(패턴, 텍스트) : 텍스트 안에서 패턴과 일치하는 모든 것을 '리스트'로 찾아줍니다.
results = re.findall(phone_pattern, text)

print("찾아낸 전화번호 목록:", results)

실행 결과:

찾아낸 전화번호 목록: ['010-1234-5678', '010-9876-5432', '02-111-2222']

💡 꿀팁: r의 의미
패턴 문자열 앞에 r을 붙이는 것(r"...")은 Raw String이라는 뜻으로, 파이썬에게 "이 안의 역슬래시(\)를 특수기호로 처리하지 말고 있는 그대로(정규식 기호로) 봐줘!"라고 알려주는 필수 관행입니다.


3. 원하는 형태로 싹 바꾸기: re.sub()

데이터를 수집했는데, 개인정보 보호를 위해 전화번호 뒷자리를 별표(*)로 마스킹 처리하거나, 특수문자를 다 지워버리고 싶을 때 사용합니다. 엑셀의 '찾아 바꾸기'의 초강력 업그레이드 버전입니다.

📌 예제 코드: 주민등록번호 뒷자리 마스킹하기

import re

info = "저의 주민번호는 901225-1234567 입니다. 친구는 911111-2345678 이에요."

# 패턴: 숫자 6개 + 하이픈(-) + 숫자 7개
# 괄호 ( )를 쳐주면 그 부분을 '그룹'으로 묶어서 기억할 수 있습니다.
# 앞부분(생년월일과 -)을 그룹 1번으로 묶어줍니다.
jumin_pattern = r"(\d{6}-)\d{7}"

# re.sub(패턴, 바꿀형태, 텍스트)
# \g<1> 은 "방금 패턴에서 괄호로 묶었던 1번 그룹(앞부분)은 그대로 두고!" 라는 뜻입니다.
masked_info = re.sub(jumin_pattern, r"\g<1>*******", info)

print("원본:", info)
print("마스킹 결과:", masked_info)

실행 결과:

원본: 저의 주민번호는 901225-1234567 입니다. 친구는 911111-2345678 이에요.
마스킹 결과: 저의 주민번호는 901225-******* 입니다. 친구는 911111-******* 이에요.

📌 예제 코드: 지저분한 특수문자 한 방에 날리기

크롤링한 텍스트에서 한글, 알파벳, 숫자, 띄어쓰기만 남기고 이상한 기호들을 다 지우고 싶을 때 아주 유용합니다.

import re

dirty_text = "안녕!@#$ 파이썬(Python) 100점^^ 완성!!!"

# 패턴: [^가-힣a-zA-Z0-9\s] 
# 대괄호 안의 ^ 는 "NOT(이것들 빼고 전부)" 이라는 뜻입니다.
# 즉, "한글, 영문 대소문자, 숫자, 공백(\s) 빼고 나머지 전부 다 찾아라!"
clean_pattern = r"[^가-힣a-zA-Z0-9\s]"

# 특수문자들을 "" (빈 문자열)로 교체하여 아예 지워버립니다.
clean_text = re.sub(clean_pattern, "", dirty_text)

print("정제된 텍스트:", clean_text)
# 출력: 안녕 파이썬Python 100점 완성

4. 실전 응용: 이메일 주소만 추출하기

가장 대표적인 정규표현식 예제인 이메일 추출입니다. 이메일은 아이디@도메인.주소 형태를 띠고 있습니다.

import re

text = """
제 개인 이메일은 python_king123@gmail.com 이고요,
회사 이메일은 admin@company.co.kr 입니다.
연락 주세요!
"""

# 이메일 패턴 분석:
# 1. [a-zA-Z0-9_-]+ : 영문자, 숫자, 언더바, 하이픈으로 이루어진 아이디 (1개 이상)
# 2. @ : 골뱅이 기호
# 3. [a-zA-Z0-9.-]+ : 도메인 이름 (영문자, 숫자, 마침표, 하이픈)
# 4. \. : 진짜 마침표(.) 기호 (정규식에서 그냥 .을 쓰면 '모든 문자'를 뜻하므로 역슬래시를 붙여야 함)
# 5. [a-zA-Z]{2,} : com, net, kr 같은 최상위 도메인 (영문자 2개 이상)

email_pattern = r"[a-zA-Z0-9_-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}"

emails = re.findall(email_pattern, text)
print("추출된 이메일:", emails)

실행 결과:

추출된 이메일: ['python_king123@gmail.com', 'admin@company.co.kr']

📝 마치며

오늘 배운 정규표현식 요약입니다.

  1. import re: 파이썬에서 정규식을 쓰기 위한 마법의 모듈.
  2. re.findall(패턴, 텍스트): 패턴에 맞는 모든 글자를 찾아서 리스트로 뽑아준다.
  3. re.sub(패턴, 교체할_글자, 텍스트): 패턴에 맞는 글자를 찾아 다른 글자로 싹 바꿔준다. (데이터 정제 필수품!)
  4. 패턴 앞에는 항상 r을 붙이는 습관을 들이자! (r"\d+")

정규표현식은 처음엔 외계어 같지만, 파이썬뿐만 아니라 엑셀, 자바스크립트 등 거의 모든 IT 환경에서 똑같이 쓰이는 만국 공통어입니다.
복잡한 패턴을 직접 다 외울 필요는 없습니다. 구글에 "이메일 정규표현식", "전화번호 정규식" 이라고 검색하면 전 세계 개발자들이 만들어둔 훌륭한 패턴들이 넘쳐나니 복사해서 re 모듈에 적용하기만 하면 됩니다!

이제 여러분은 파이썬으로 데이터를 자유자재로 요리할 수 있는 완벽한 셰프가 되셨습니다! 

반응형
Comments