| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | ||
| 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 13 | 14 | 15 | 16 | 17 | 18 | 19 |
| 20 | 21 | 22 | 23 | 24 | 25 | 26 |
| 27 | 28 | 29 | 30 |
- 인텔리제이
- junit
- 스프링부트
- java테스트
- string
- IntelliJ
- list
- 테스트자동화
- html
- input
- Eclipse
- CSS
- vscode
- HashMap
- 정규식
- js
- math
- junit5
- 단위테스트
- 자바문법
- 자바
- javascript
- 배열
- Java
- Array
- 문자열
- 자바스크립트
- Visual Studio Code
- ArrayList
- SpringBoot
- Today
- Total
어제 오늘 내일
[Python] "원하는 데이터만 쏙쏙!" 파이썬 정규표현식(Regex) 기초 완벽 가이드 본문
정규표현식(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']
📝 마치며
오늘 배운 정규표현식 요약입니다.
import re: 파이썬에서 정규식을 쓰기 위한 마법의 모듈.re.findall(패턴, 텍스트): 패턴에 맞는 모든 글자를 찾아서 리스트로 뽑아준다.re.sub(패턴, 교체할_글자, 텍스트): 패턴에 맞는 글자를 찾아 다른 글자로 싹 바꿔준다. (데이터 정제 필수품!)- 패턴 앞에는 항상
r을 붙이는 습관을 들이자! (r"\d+")
정규표현식은 처음엔 외계어 같지만, 파이썬뿐만 아니라 엑셀, 자바스크립트 등 거의 모든 IT 환경에서 똑같이 쓰이는 만국 공통어입니다.
복잡한 패턴을 직접 다 외울 필요는 없습니다. 구글에 "이메일 정규표현식", "전화번호 정규식" 이라고 검색하면 전 세계 개발자들이 만들어둔 훌륭한 패턴들이 넘쳐나니 복사해서 re 모듈에 적용하기만 하면 됩니다!
이제 여러분은 파이썬으로 데이터를 자유자재로 요리할 수 있는 완벽한 셰프가 되셨습니다!
'IT > Python' 카테고리의 다른 글
| [Python] "중복 데이터, 대체 어디 숨어있어?" 파이썬 리스트 중복 인덱스(위치) 찾기 완벽 가이드 (0) | 2026.05.12 |
|---|---|
| [Python] "리스트 안의 리스트?" 2차원 리스트 중복 제거 (1) | 2026.04.17 |
| [Python 기초] "중복 제거와 정렬을 단 한 줄로!" 파이썬 리스트 완벽 정리 비법 (1) | 2026.04.16 |
| [Python 기초] "똑같은 데이터 다 나와!" 파이썬 리스트 중복 제거 완벽 가이드 (순서 유지 vs 순서 무시) (0) | 2026.04.16 |
| [Python 기초] "뒤죽박죽 데이터 깔끔하게 줄 세우기!" 파이썬 리스트 정렬 (sort vs sorted) (0) | 2026.04.15 |