본문 바로가기
기초 및 언어/▶ python

22_Python_정규표현식

by 류딩이 2025. 10. 31.

🧩 Python 정규표현식(Regex)  정리 예제

re 모듈을 활용한 정규식 패턴 매칭

 


🔹 1️⃣ 기본 패턴 매칭 (match vs search) 

import re

L = ['ab123', 'cd456', 'xy789', '12ef345qw', 'abc12']

# [패턴 설명]
# ^           → 문자열의 시작
# [a-zA-Z]{2} → 알파벳 2개
# \d{3}       → 숫자 3개
# $           → 문자열의 끝
regex = '^[a-zA-Z]{2}\\d{3}$'
pattern = re.compile(regex)

print("="*10, "match", "="*10)
# match(): 문자열의 처음부터 패턴이 일치해야 매치됨
for item in L:
    if pattern.match(item):
        print(f"패턴 일치: {item}")
    else:
        print(f"패턴 불일치: {item}")

print("="*10, "search", "="*10)
# search(): 문자열 전체 중 패턴이 포함되면 매치됨
for item in L:
    if pattern.search(item):
        print(f"패턴 일치: {item}")
    else:
        print(f"패턴 불일치: {item}")
========== match ==========
패턴 일치: ab123
패턴 일치: cd456
패턴 일치: xy789
패턴 불일치: 12ef345qw
패턴 불일치: abc12
========== search ==========
패턴 일치: ab123
패턴 일치: cd456
패턴 일치: xy789
패턴 불일치: 12ef345qw
패턴 불일치: abc12

🔹 2️⃣ 숫자 3개 이상 포함된 파일명 찾기

L = ['a.txt', 'a12.txt', 'a123.txt', 'a12345.txt']
regex = '^[a]\\d{3,}\\.txt$'   # a + 숫자 3개 이상 + .txt
pattern = re.compile(regex)

print("="*10, "a 숫자 3개 이상인 .txt", "="*10)
for item in L:
    if pattern.search(item):
        print(f"패턴 일치: {item}")
    else:
        print(f"패턴 불일치: {item}")
패턴 불일치: a.txt
패턴 불일치: a12.txt
패턴 일치: a123.txt
패턴 일치: a12345.txt

🔹 3️⃣ 한글만으로 구성된 문자열 찾기 (fullmatch)

L = ['hello!', 'hello안녕~', '하하하', '안녕^^', '반갑습니다.', '또 만나요', '파이썬', 'grape#*']
regex = '^[가-힣]+$'

# re.fullmatch(): 전체 문자열이 정확히 패턴과 일치해야 함
result = [word for word in L if re.fullmatch(regex, word)]
print(result)
['하하하', '파이썬']

🔹 4️⃣ findall / sub로 문자열 처리

print(re.findall('[가-힣]+', '안녕123 하세요!!! hello~~~'))
print(re.sub('\\s+', ' ', '   안녕        하세옹~~~ 까꿍   '))
출력 결과
['안녕', '하세요']
안녕 하세옹~~~ 까꿍

 

🔹 5️⃣ 이메일 아이디 / 도메인 분리

mailList = ['abc@naver.com', 'xya@daum.net', 'qwer@google.com']

userList = []
for mail in mailList:
    user, domain = re.split("@", mail)
    userList.append(f"아이디:{user}, 도메인:{domain}")

for info in userList:
    print(info)
아이디:abc, 도메인:naver.com
아이디:xya, 도메인:daum.net
아이디:qwer, 도메인:google.com

🔹 6️⃣ 그룹핑 (이름, 나이 추출)

text = '홍길동, 30세'
pattern = re.compile('(.+),\\s(\\d+)세')
match = pattern.fullmatch(text)

if match:
    print(f"이름 : {match.group(1)}")
    print(f"나이 : {match.group(2)}")
이름 : 홍길동
나이 : 30

 

 

🔹 7️⃣ 주소 패턴 추출 (시/구/동/번지)

address = "서울특별시 강남구 역삼동 123-45"
pattern = re.compile(r'(.+시)\s(.+구)\s(.+동)\s(\d{3}-\d{2})')
match = pattern.fullmatch(address)

if match:
    print(f"{match.group(0)}")
    print(f"시 : {match.group(1)}")
    print(f"구 : {match.group(2)}")
    print(f"동 : {match.group(3)}")
    print(f"번지: {match.group(4)}")
서울특별시 강남구 역삼동 123-45
시 : 서울특별시
구 : 강남구
동 : 역삼동
번지: 123-45

🔹 8️⃣ 날짜 패턴 추출

text = "오늘은 2025-10-23 입니다."
pattern = re.compile(r'(.+)\s(\d{4})-(\d{1,2})-(\d{1,2})\s(.+)')
match = pattern.search(text)

if match:
    today = match.group(1)
    year = match.group(2)
    month = match.group(3)
    day = match.group(4)
    string = match.group(5)

    print(f"{today} {year}년 {month}월 {day}일 {string}")
오늘은 2025년 10월 23일 입니다.

🔹 9️⃣ 파일 내용에서 이름별 합계 계산

전지현 80 90 83
김혜수 60 57 57
공유 100 88 89
fr = open("a.txt", encoding="utf-8", mode="r")
lines = fr.readlines()

for line in lines:
    pattern = re.compile(r'(.+)\s(\d{2})\s(\d{0,})\s(\d{0,})')
    match = pattern.search(line.strip())

    if match:
        sum1 = int(match.group(2))
        sum2 = int(match.group(3))
        sum3 = int(match.group(4))
        total = sum1 + sum2 + sum3

        print(f"{match.group(1)} - 합계 : {total}")
전지현 - 합계 : 253
김혜수 - 합계 : 174
공유 - 합계 : 277

 


정리

함수  설명
match() 문자열 시작부터 패턴이 일치해야 매치
search() 문자열 전체 중 한 곳이라도 일치하면 매치
fullmatch() 문자열 전체가 정확히 일치해야 매치
findall() 일치하는 모든 문자열을 리스트로 반환
sub() 일치하는 패턴을 치환(replace)
split() 패턴 기준으로 문자열 분리
group(n) 그룹핑된 n번째 그룹 추출

 

'기초 및 언어 > ▶ python' 카테고리의 다른 글

24_Python_Pandas  (0) 2025.11.03
23_Python_NumPy  (0) 2025.10.31
Jinja 템플릿 엔진  (0) 2023.12.18
FastAPI 가이드:고성능 비동기 API 서버 구축의 모든 것  (0) 2023.12.16
21_Python 파이썬 동기/비동기  (0) 2023.12.13