python

13편 Python 기초 문법: 정규 표현식

파이썬 티쳐 2024. 11. 17. 09:43

1. 정규 표현식의 기본 개념

1.1 정규 표현식이란 무엇인가

정규 표현식(Regular Expression)은 특정한 규칙을 가진 문자열을 검색하거나, 일치 여부를 판단하는 데 사용되는 패턴입니다. 복잡한 문자열 검색, 치환, 추출 작업을 매우 간단하게 처리할 수 있습니다.

1.2 정규 표현식을 사용하는 이유

정규 표현식은 다음과 같은 작업에 유용합니다:

  • 텍스트에서 패턴에 맞는 특정 데이터 추출 (예: 이메일 주소, 전화번호)
  • 입력된 데이터의 유효성 검사 (예: 비밀번호 규칙, 이메일 형식 검증)
  • 문자열에서 특정 패턴 치환 및 제거

1.3 re 모듈 소개

Python에서 정규 표현식을 다루기 위해 re 모듈을 사용합니다.

import re

1.4 기본 패턴과 메타 문자

정규 표현식은 일반적인 문자와 특별한 의미를 가지는 메타 문자로 구성됩니다.

  • .: 임의의 한 문자와 일치 (개행 문자를 제외한 모든 문자)
  • ^: 문자열의 시작을 의미
  • $: 문자열의 끝을 의미
  • *: 앞에 있는 문자가 0번 이상 반복
  • +: 앞에 있는 문자가 1번 이상 반복
  • ?: 앞에 있는 문자가 0번 또는 1번 나타남
  • []: 문자 집합
pattern = r"\d+"  # 숫자가 1개 이상 나타나는 패턴
text = "I have 2 apples and 10 oranges."
matches = re.findall(pattern, text)
print(matches)  # 출력: ['2', '10']

2. 정규 표현식 메서드

2.1 re.match()re.search()의 차이점

re.match(): 문자열의 시작 부분에서 패턴과 일치하는지 확인합니다.

result = re.match(r"\d+", "123abc")
print(result.group())  # 출력: 123

re.search(): 문자열 전체에서 패턴을 검색하고, 첫 번째로 일치하는 결과를 반환합니다.

result = re.search(r"\d+", "abc123def")
print(result.group())  # 출력: 123

2.2 re.findall()re.finditer()를 사용한 문자열 검색

re.findall(): 문자열에서 패턴과 일치하는 모든 부분을 리스트로 반환합니다.

pattern = r"\d+"
text = "There are 12 cats and 9 dogs."
result = re.findall(pattern, text)
print(result)  # 출력: ['12', '9']

re.finditer(): 일치하는 모든 부분을 찾아 이터레이터 객체를 반환하며, 각 결과의 위치 정보도 함께 제공합니다.

result = re.finditer(r"\d+", text)
for match in result:
    print(match.group(), match.start(), match.end())
# 출력:
# 12 10 12
# 9 21 22

2.3 re.sub()로 문자열 치환

re.sub()는 패턴과 일치하는 부분을 새로운 문자열로 치환합니다.

text = "My phone number is 123-456-7890."
pattern = r"\d{3}-\d{3}-\d{4}"  # 전화번호 패턴
new_text = re.sub(pattern, "XXX-XXX-XXXX", text)
print(new_text)  # 출력: My phone number is XXX-XXX-XXXX.

2.4 실전 예제: 이메일 주소와 전화번호 검증

email = "user@example.com"
pattern = r"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}"
is_valid = re.match(pattern, email)
print("Valid email" if is_valid else "Invalid email")

phone = "123-456-7890"
pattern = r"\d{3}-\d{3}-\d{4}"
is_valid = re.match(pattern, phone)
print("Valid phone" if is_valid else "Invalid phone")

3. 정규 표현식을 활용한 프로그램

3.1 간단한 텍스트 필터링 프로그램 만들기 (특정 단어 필터링)

다음 프로그램은 텍스트에서 특정 단어를 필터링하여 제거합니다.

def filter_words(text, words_to_filter):
    pattern = "|".join(words_to_filter)  # 필터링할 단어들
    return re.sub(pattern, "[FILTERED]", text)

text = "This is a bad word example."
filtered_text = filter_words(text, ["bad", "word"])
print(filtered_text)  # 출력: This is a [FILTERED] [FILTERED] example.

3.2 정규 표현식을 사용한 데이터 유효성 검사 (우편번호, IP 주소)

우편번호 유효성 검사:

postal_code = "12345"
pattern = r"\d{5}"
is_valid = re.match(pattern, postal_code)
print("Valid postal code" if is_valid else "Invalid postal code")

IP 주소 유효성 검사:

ip_address = "192.168.1.1"
pattern = r"(\d{1,3}\.){3}\d{1,3}"
is_valid = re.match(pattern, ip_address)
print("Valid IP" if is_valid else "Invalid IP")