08장 파이썬 강좌 – 정규표현식

정규표현식(Regular Expressions)은 문자열 내에서 특정한 패턴을 찾거나 대체하는 데 사용되는 매우 강력한 도구입니다. 그는 많은 프로그래밍 언어에서 지원되며, 특히 텍스트 처리를 자주 필요로 하는 작업에서 필수적인 기술입니다.

이 강좌에서는 파이썬의 내장 모듈인 re 모듈을 사용하여 정규표현식을 다루는 방법을 배울 것입니다. 이 모듈은 문자열 검색 및 변경, 패턴 매칭과 같은 정규표현식의 거의 모든 기능을 제공합니다.

정규표현식 기본 개념

정규표현식은 특정 패턴을 사용하여 문자열을 검색하는 방법의 일종입니다. 대부분의 텍스트 편집기에서 지원하며, 프로그래밍 언어에서도 널리 사용됩니다. 정규표현식은 일종의 미니언어로 간주될 수 있으며, 문자열을 처리하고 분석하는 데 있어 매우 유용합니다.

정규표현식의 기본 구성 요소

  • 리터럴 문자: 자신을 그대로 뜻하는 문자들 예를 들어, a는 그냥 문자 a를 의미합니다.
  • 메타 문자: 특별한 의미를 가지는 문자들로, .^$*+?[]{}()| 등이 있습니다.

정규표현식에서의 중요한 메타 문자

  • .: 임의의 단일 문자를 의미합니다. 예를 들어, a.c는 a와 c 사이에 어떤 문자라도 있는 ‘a-c’ 형식을 찾습니다.
  • []: 대괄호 안에 있는 여러 문자 중 하나를 의미합니다. [abc]는 a, b 또는 c 중 하나를 찾습니다.
  • ^: 문자열의 시작을 의미합니다. 예를 들어, ^abc는 ‘abc’로 시작하는 문자열을 찾습니다.
  • $: 문자열의 끝을 의미합니다. xyz$는 ‘xyz’로 끝나는 문자열을 찾습니다.
  • *: 바로 앞의 문자가 0번 이상 반복되는 것을 의미합니다. 예를 들어, bo*는 ‘b’, ‘bo’, ‘boo’, ‘booo’ 등의 패턴을 찾습니다.
  • +: 바로 앞의 문자가 1번 이상 반복되는 것을 의미합니다. bo+는 ‘bo’, ‘boo’, ‘booo’ 등의 패턴을 찾습니다.
  • ?: 바로 앞의 문자가 0 또는 1번 나타남을 의미합니다. colou?r은 ‘color’와 ‘colour’ 모두를 찾을 수 있습니다.
  • {}: 중괄호 안의 숫자는 반복되는 회수를 지정합니다. 예를 들어, a{2}는 ‘aa’를 의미하고, a{2,3}는 ‘aa’ 또는 ‘aaa’를 의미합니다.
  • (): 그룹을 지정합니다. 이를 통해 하나의 전체 패턴을 묶거나, 캡처해서 사용할 수 있습니다.
  • |: OR 연산자로 ‘A 또는 B’를 의미합니다. a|b는 ‘a’ 또는 ‘b’를 의미합니다.

파이썬에서 정규표현식 사용하기

파이썬에서 정규표현식 기능은 re 모듈을 통해 제공됩니다. 이 모듈을 사용하여 다양한 정규표현식 패턴을 검증, 검색 및 수정할 수 있습니다.

re 모듈 기본 사용법

import re

# 정규표현식 패턴에 매칭되는지 체크
pattern = r"^abc"
string = "abcdefg"
if re.match(pattern, string):
    print("정규표현식에 매칭됩니다!")
else:
    print("매칭되지 않습니다.")
    

위의 코드에서는 ^abc라는 정규 표현식을 사용하여 문자열이 ‘abc’로 시작하는지를 확인합니다. match 함수는 문자열 시작부터 검색을 하므로, ‘abcdefg’는 ‘abc’로 시작하므로 매칭됩니다.

중첩 패턴 검색: re.search()

match()와 달리 search()는 문자열 전체에서 패턴을 찾을 수 있습니다. 예를 들어, 문자열 내 중간에 있는 패턴도 찾습니다.

import re

pattern = r"abc"
string = "xyzabcdef"

if re.search(pattern, string):
    print("패턴이 발견되었습니다!")
else:
    print("패턴이 발견되지 않았습니다.")
    

모든 패턴 찾기: re.findall()

문자열 내에서 패턴과 맞는 모든 부분을 리스트로 반환하고 싶을 때 사용합니다.

import re

pattern = r"a"
string = "banana"

matches = re.findall(pattern, string)
print(matches)
    

위의 예제에서는, 문자열 ‘banana’에서 ‘a’를 모두 찾아 리스트로 반환합니다, 결과는 [‘a’, ‘a’, ‘a’]가 됩니다.

패턴 대체하기: re.sub()

매칭되는 패턴을 다른 문자열로 대체하려면 sub() 함수를 사용합니다.

import re

pattern = r"a"
replacement = "o"
string = "banana"

new_string = re.sub(pattern, replacement, string)
print(new_string)
    

이 코드는 문자열 ‘banana’의 모든 ‘a’를 ‘o’로 변경하여 ‘bonono’라는 결과를 생성합니다.

실제 예제를 통한 정규표현식의 응용

정규표현식은 데이터 검증, 데이터 추출 및 데이터 조작에 있어 매우 효과적입니다. 여기서는 전화번호, 이메일, URL 추출과 같은 실제 예제를 통해 정규표현식의 응용을 알아보겠습니다.

1. 전화번호 추출

전화번호는 다양한 형식으로 존재할 수 있습니다. 예를 들어, ‘(123) 456-7890’, ‘123.456.7890’, ‘123-456-7890’ 등의 형식입니다. 이를 추출하는 정규 표현식을 작성해 봅시다.

import re

pattern = r"\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4}"
text = "연락처: (123) 456-7890, 그리고 123-456-7890."

phone_numbers = re.findall(pattern, text)
print(phone_numbers)
    

위의 정규표현식은 다양한 형식의 전화번호를 추출할 수 있습니다.

2. 이메일 주소 검증 및 추출

이메일 주소는 일반적으로 username@domain.extension 형태로 되어 있습니다. 이를 추출하는 정규표현식은 다음과 같습니다:

import re

pattern = r"\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,7}\b"
text = "문의사항은 contact@example.com 으로 이메일을 보내 주세요."

emails = re.findall(pattern, text)
print(emails)
    

이 정규표현식은 이메일 주소 형식을 따라 다양한 이메일 주소를 추출할 수 있습니다.

3. URL 추출

웹 페이지에서 URL 링크를 추출하는 것도 유용할 수 있습니다. 정규표현식을 사용하여 큰 텍스트에서 URL을 쉽게 검색할 수 있습니다.

import re

pattern = r"https?://(?:www\.)?\S+\.\S+"
text = "저희 웹사이트는 https://www.example.com 입니다. 링크를 방문해보세요."

urls = re.findall(pattern, text)
print(urls)
    

이 예제의 정규표현식은 HTTP 및 HTTPS로 시작하는 URL을 추출합니다. ‘www’가 있을 수도 있고 없을 수도 있으며, 도메인 이름 뒤에는 다양한 확장자가 올 수 있습니다.

정규표현식 디버깅 및 최적화

정규표현식은 매우 강력하지만, 복잡한 패턴을 작성할 때는 오류가 발생할 수 있습니다. 따라서 이를 디버깅하고 최적화하는 몇 가지 팁을 소개합니다.

주석 사용하기

정규표현식에 주석을 달면 복잡한 패턴을 이해하기 쉽게 만들 수 있습니다. 파이썬에서는 re.VERBOSE 플래그를 사용해서 주석을 추가할 수 있습니다.

import re

pattern = r"""
(?x)            # 정규표현식 레이아웃을 말하며, 주석 사용 가능
\(?\d{3}\)?    # 지역번호, 선택적 괄호
[-.\s]?         # 지역번호 뒤의 구분자
\d{3}          # 세 자리 번호
[-.\s]?         # 다음 번호 사이의 구분자
\d{4}          # 마지막 네 자리 번호
"""
text = "여기에 전화번호 (123) 456-7890 및 987-654-3210가 있습니다."
phone_numbers = re.findall(pattern, text)
print(phone_numbers)
    

효율적인 패턴 작성

  • 가능하면 단순하고 명확한 패턴을 사용하여 처리 속도를 높입니다.
  • 특정 매칭 범위를 감소시켜 검색 시간을 단축합니다.
  • 문자 클러스터를 사용하여 여러 메타문자를 축소하여 적용합니다.

결론

정규표현식은 문자열 처리를 위한 강력하고 유연한 도구입니다. 처음에는 복잡해 보일 수 있지만, 익숙해지면 데이터 검색, 검증 및 변환을 위한 탁월한 도구가 됩니다. 위의 실습 예제를 통해 실전에서 정규표현식을 어떻게 사용하는지 직접 시도해 보시길 바랍니다. 파이썬의 re 모듈을 활용하여 다양한 형태의 문자열을 효과적으로 처리할 수 있도록 연습하시기 바랍니다.

답글 남기기

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