Tech & Development/Programming Languages

[Python] 정규 표현식 (Regex)

Theo (테오) 2024. 11. 12. 00:22
반응형

정규 표현식(Regex, Regular Expression)은 문자열에서 특정 패턴을 찾고, 추출하거나, 치환할 때 사용하는 방법입니다. Python에서는 re 모듈을 통해 정규 표현식을 사용할 수 있습니다. 정규 표현식은 다양한 패턴을 통해 복잡한 문자열을 다룰 수 있어, 데이터 처리, 텍스트 분석, 웹 크롤링 등에 자주 활용됩니다.

기본적인 정규 표현식 패턴

정규 표현식에는 다양한 패턴이 있으며, 기본적인 패턴은 다음과 같습니다:

  • . : 줄 바꿈 문자를 제외한 모든 문자 하나와 일치
  • ^ : 문자열의 시작을 의미
  • $ : 문자열의 끝을 의미
  • * : 앞의 문자가 0번 이상 반복됨을 의미
  • + : 앞의 문자가 1번 이상 반복됨을 의미
  • ? : 앞의 문자가 0번 또는 1번 나타남을 의미
  • {n} : 정확히 n번 반복되는 패턴
  • {n, m} : n번 이상 m번 이하 반복되는 패턴
  • [] : 대괄호 안에 있는 문자 중 하나와 일치 (예: [abc]는 'a', 'b', 또는 'c' 중 하나와 일치)
  • | : OR 연산자 (예: a|b는 'a' 또는 'b'와 일치)
  • \d : 숫자와 일치 ([0-9]와 동일)
  • \D : 숫자가 아닌 문자와 일치
  • \w : 알파벳 문자, 숫자, 밑줄과 일치 ([a-zA-Z0-9_]와 동일)
  • \W : 알파벳 문자, 숫자, 밑줄이 아닌 문자와 일치
  • \s : 공백 문자와 일치
  • \S : 공백이 아닌 문자와 일치

기본 사용법

Python의 re 모듈을 사용하여 정규 표현식을 쉽게 다룰 수 있습니다.

import re

text = "The price is $10.99"
pattern = r"\d+\.\d{2}"

match = re.search(pattern, text)
if match:
    print(match.group())  # "10.99"

위 예제에서 \d+는 숫자가 하나 이상 나오는 패턴을 찾고, \.은 소수점, \d{2}는 소수점 뒤에 숫자가 정확히 두 개 오는 패턴을 의미합니다.

주요 함수들

Python re 모듈에서 자주 사용하는 함수는 다음과 같습니다.

1. re.search(): 첫 번째로 일치하는 결과를 찾고 반환합니다. 일치하는 결과가 없으면 None을 반환합니다.

import re

match = re.search(r"\d+", "The number is 42")
print(match.group()) # "42"

2. re.findall(): 일치하는 모든 결과를 리스트로 반환합니다.

import re

matches = re.findall(r"\d+", "My numbers are 42, 98, and 35")
print(matches) # ['42', '98', '35']

3. re.sub(): 특정 패턴을 다른 문자열로 치환합니다.

import re

result = re.sub(r"[aeiou]", "*", "Hello World")
print(result) # "H*ll* W*rld"

4. re.match(): 문자열의 시작에서 패턴을 찾습니다. 시작 부분과 일치하지 않으면 None을 반환합니다.

import re

match = re.match(r"\d+", "42 is the answer")
print(match.group()) # "42"

5. re.split(): 패턴을 기준으로 문자열을 분리하여 리스트로 반환합니다.

import re

result = re.split(r"\s+", "This is a test")
print(result) # ['This', 'is', 'a', 'test']

실전 예제

다음은 실전에서 유용한 다양한 정규 표현식 예제입니다.

1. 이메일 주소 찾기: 이메일 주소를 텍스트에서 추출하는 예제입니다.

import re

text = "Please contact us at support@example.com or sales@example.org for assistance."
email_pattern = r"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}"

emails = re.findall(email_pattern, text)
print("Found emails:", emails)  # ['support@example.com', 'sales@example.org']

2. 전화번호 찾기: 일반적인 미국 전화번호 패턴 (예: (123) 456-7890 또는 123-456-7890)을 찾는 예제입니다.

import re

text = "You can reach us at (123) 456-7890 or 111-222-3333."
phone_pattern = r"\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4}"

phone_numbers = re.findall(phone_pattern, text)
print("Found phone numbers:", phone_numbers)  # ['(123) 456-7890', '111-222-3333']

3. URL 찾기: 텍스트에서 웹사이트 URL을 추출하는 예제입니다.

import re

text = "Visit our website at https://www.example.com or http://blog.example.com for more info."
url_pattern = r"https?://[a-zA-Z0-9.-]+(?:\.[a-zA-Z]{2,})(?:/[a-zA-Z0-9._%+-]*)*"

urls = re.findall(url_pattern, text)
print("Found URLs:", urls)  # ['https://www.example.com', 'http://blog.example.com']

4. 날짜 찾기 (YYYY-MM-DD 형식): 문자열에서 YYYY-MM-DD 형식의 날짜를 찾는 예제입니다.

import re

text = "Important dates: 2023-01-25, 2024-12-31."
date_pattern = r"\b\d{4}-\d{2}-\d{2}\b"

dates = re.findall(date_pattern, text)
print("Found dates:", dates)  # ['2023-01-25', '2024-12-31']

5. 숫자 형식 (소수 포함): 숫자 (정수 및 소수 포함)를 찾는 예제입니다.

import re

text = "The price is 10.99, but we also have discounts like 50% and $100."
number_pattern = r"\b\d+(\.\d+)?\b"

numbers = re.findall(number_pattern, text)
print("Found numbers:", numbers)  # ['10.99', '50', '100']

6. 특정 단어 포함 문장 찾기: 특정 단어(예: Python)가 포함된 문장 전체를 찾는 예제입니다.

import re

text = "I love Python programming. Python is versatile and powerful. Other languages are also great."
sentence_pattern = r"[^.]*\bPython\b[^.]*\."

sentences = re.findall(sentence_pattern, text)
print("Sentences with 'Python':", sentences)
# ['I love Python programming.', 'Python is versatile and powerful.']

이와 같이 정규 표현식을 사용하면 다양한 형식의 데이터를 효율적으로 찾고 추출할 수 있습니다.


정규 표현식이 복잡하게 느껴진다면, regex101.com 사이트를 활용하는 것이 큰 도움이 됩니다. 이 사이트에서는 정규 표현식 패턴과 테스트할 문자열을 입력하여 즉각적인 결과와 일치 정보를 확인할 수 있습니다.

사용 방법

  1. Regular Expression: 상단에 정규 표현식을 입력합니다.
  2. Test String: 테스트할 문자열을 아래 입력합니다.
  3. Match Information: 일치하는 부분이 강조 표시되며, 각 매칭 결과에 대한 상세한 정보(시작과 끝 위치, 그룹 등)를 제공합니다.

이와 같은 실시간 피드백을 통해 정규 표현식의 작동 방식을 시각적으로 확인할 수 있어, 복잡한 패턴도 쉽게 디버깅하고 수정할 수 있습니다.


정규 표현식의 장점과 주의사항

정규 표현식은 매우 강력한 도구이지만, 복잡한 패턴을 사용할수록 가독성이 떨어질 수 있습니다. 특히, 유지보수성을 고려하여 주석이나 패턴의 의미를 명확히 하는 것이 중요합니다.

정규 표현식은 Python에서 텍스트를 다룰 때 매우 유용하며, 데이터를 추출하거나 변환할 때 강력한 도구로 활용할 수 있습니다.

반응형