[Python] 정규 표현식 (Regex)
정규 표현식(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 사이트를 활용하는 것이 큰 도움이 됩니다. 이 사이트에서는 정규 표현식 패턴과 테스트할 문자열을 입력하여 즉각적인 결과와 일치 정보를 확인할 수 있습니다.
사용 방법
- Regular Expression: 상단에 정규 표현식을 입력합니다.
- Test String: 테스트할 문자열을 아래 입력합니다.
- Match Information: 일치하는 부분이 강조 표시되며, 각 매칭 결과에 대한 상세한 정보(시작과 끝 위치, 그룹 등)를 제공합니다.
이와 같은 실시간 피드백을 통해 정규 표현식의 작동 방식을 시각적으로 확인할 수 있어, 복잡한 패턴도 쉽게 디버깅하고 수정할 수 있습니다.
정규 표현식의 장점과 주의사항
정규 표현식은 매우 강력한 도구이지만, 복잡한 패턴을 사용할수록 가독성이 떨어질 수 있습니다. 특히, 유지보수성을 고려하여 주석이나 패턴의 의미를 명확히 하는 것이 중요합니다.
정규 표현식은 Python에서 텍스트를 다룰 때 매우 유용하며, 데이터를 추출하거나 변환할 때 강력한 도구로 활용할 수 있습니다.