08-1 파이썬 강좌 – 정규 표현식 살펴보기

정규 표현식이란?

정규 표현식(Regular Expressions, 줄여서 regex 또는 regexp)은 특정한 규칙에 맞는 문자열을 검색, 치환, 추출할 때 사용되는 문자열입니다. 주로 텍스트 프로세싱에서 여러 패턴을 검색하거나 데이터 유효성 검사를 위해 사용됩니다.

정규 표현식의 기본 개념

정규 표현식의 기본 개념을 이해하기 위해 일반적으로 사용되는 몇 가지 특별한 문자를 이해해야 합니다.

기본 패턴

  • 점(.): 임의의 한 문자를 나타냅니다.
  • 대괄호([]): 대괄호 안의 문자 중 하나를 나타냅니다. 예: [abc]
  • 캐럿(^): 문자열의 시작을 나타냅니다. 예: ^Hello
  • 달러 기호($): 문자열의 끝을 나타냅니다. 예: world$
  • 별표(*): 이전 문자가 0번 이상 반복되는 것을 나타냅니다. 예: a*
  • 플러스(+): 이전 문자가 1번 이상 반복되는 것을 나타냅니다. 예: a+
  • 물음표(?): 이전 문자가 0번 또는 1번 나타나는 것을 나타냅니다. 예: a?

메타 문자

메타 문자들은 정규식에서 특별한 의미로 사용되며, 종종 필요에 따라 이스케이프하여 문자 그대로 사용해야 합니다.

  • 백슬래시(\\): 이스케이프 문자로, 특수 문자를 일반 문자로 사용하기 위해 씁니다.
  • 파이프(|): OR 연산자로 여러 패턴 중 하나라도 매칭되면 참으로 간주합니다. 예: a|b
  • 괄호(()): 그룹화를 나타내며, 서브패턴을 만들 때 사용합니다. 예: (ab)

파이썬에서의 정규 표현식 사용법

파이썬에서는 `re` 모듈을 사용하여 정규 표현식을 다룹니다. 이 모듈은 다양한 함수를 제공하여 정규 표현식을 쉽게 사용할 수 있습니다.

re 모듈 함수

  • re.match(): 문자열의 시작 부분이 지정한 패턴과 매칭되는지 확인합니다.
  • re.search(): 문자열 전체를 검색하여 첫 번째 매칭되는 패턴을 찾습니다.
  • re.findall(): 패턴과 매칭되는 모든 부분 문자열을 리스트로 반환합니다.
  • re.finditer(): 패턴과 매칭되는 모든 부분 문자열을 순환 가능한 객체로 반환합니다.
  • re.sub(): 패턴과 매칭되는 부분 문자열을 다른 문자열로 치환합니다.

정규 표현식 사용 예제

기본 사용 예시


import re

# 문자열의 시작이 'Hello'인지 확인
result = re.match(r'^Hello', 'Hello, world!')
print(result)  # 매칭에 성공하면 매치 객체를 반환하고, 실패하면 None을 반환합니다.
    

문자열 내 패턴 찾기


import re

search_result = re.search(r'world', 'Hello, world!')
print(search_result)  # 매칭된 부분에 대한 매치 객체를 반환합니다.
    

모든 매칭 패턴 추출


# 문자열에서 모든 'a' 문자 찾기
all_matches = re.findall(r'a', 'banana')
print(all_matches)  # 찾은 모든 매칭의 리스트가 반환됩니다.
    

패턴을 기반으로 문자열 변환하기

re.sub() 함수를 사용하여 문자열 내 패턴을 다른 문자열로 변환할 수 있습니다.


# 모든 공백을 언더스코어로 교체
transformed_string = re.sub(r'\s', '_', 'Hello world!')
print(transformed_string)  # 'Hello_world!' 출력
    

고급 정규 표현식 기능

그룹과 캡처링

그룹화는 정규식의 서브패턴을 캡처하고 재사용하거나 특정 작업을 수행하는 데 매우 유용합니다.


pattern = r'(\d+)-(\d+)-(\d+)'
string = '전화번호: 123-456-7890'
match = re.search(pattern, string)

if match:
    print(match.group(0))  # 전체 매칭된 문자열
    print(match.group(1))  # 첫 번째 그룹: 123
    print(match.group(2))  # 두 번째 그룹: 456
    print(match.group(3))  # 세 번째 그룹: 789
    

Lookahead 및 Lookbehind

Lookahead와 Lookbehind는 특정 패턴 앞 또는 뒤에 있는 조건을 검사할 때 사용합니다. 이러한 기능은 흔히 사용되는 기술이지만 다소 복잡할 수 있습니다.

Lookahead 사용


# 'abc' 뒤에 'def'가 오는 패턴 찾기
lookahead_pattern = r'abc(?=def)'
lookahead_string = 'abcdefghi'
lookahead_match = re.search(lookahead_pattern, lookahead_string)
print(lookahead_match)
    

Lookbehind 사용


# '123' 앞에 오는 패턴
lookbehind_pattern = r'(?<=123)abc'
lookbehind_string = '123abc'
lookbehind_match = re.search(lookbehind_pattern, lookbehind_string)
print(lookbehind_match)
    

종합 예제: 이메일 주소 추출

정규 표현식은 특히 입력된 텍스트에서 이메일 주소를 추출하는 데 유용합니다.


email_pattern = r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}'
text = "연락처 이메일: example@example.com 또는 support@domain.com"
emails = re.findall(email_pattern, text)

print(emails)  # ['example@example.com', 'support@domain.com']
    

정리

정규 표현식은 문자열 처리에서 매우 강력한 도구이며, 파이썬의 `re` 모듈은 이를 다루기에 충분한 기능을 제공합니다. 정규 표현식의 기본 문법을 이해하고 실습하면 복잡한 텍스트 패턴을 손쉽게 다룰 수 있습니다. 이러한 기술을 꾸준히 연습하고 활용하면 더욱 복잡한 문자열 처리 문제를 효과적으로 해결할 수 있을 것입니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다