파이썬에서의 정규표현식
이 기사에서는 파이썬의 정규표현식에 대해 설명합니다.
re 모듈의 기본 사용법부터 복잡한 정규표현식 패턴 매칭까지 다양한 주제를 다룰 것입니다.
YouTube Video
파이썬에서의 정규표현식
re 모듈은 정규식을 사용하여 문자열을 검색하고 조작하는 데 사용됩니다.
re 모듈이란 무엇인가요?
re 모듈은 파이썬 표준 라이브러리에 포함되어 있으며 정규표현식을 사용한 문자열 조작 기능을 제공합니다. 정규표현식은 특정 문자열 패턴을 효율적으로 찾거나 추출하거나 대체하는 데 사용됩니다.
기본 정규표현식 패턴
정규표현식은 특수 기호를 사용하여 패턴을 정의합니다. 다음은 몇 가지 기본 패턴들입니다.
.: 임의의 단일 문자^: 문자열의 시작$: 문자열의 끝\d: 임의의 숫자 (0-9)\w: 임의의 단어 문자 (a-z, A-Z, 0-9, _)\s: 임의의 공백 문자*: 0회 이상의 반복+: 1회 이상의 반복[]: 문자 클래스 (예:[a-z]는 소문자 알파벳과 매칭)
1import re
2
3pattern = r"\d{3}-\d{4}"
4text = "My postal code is 123-4567."
5result = re.search(pattern, text)
6if result:
7 print(result.group()) # Output: 123-4567
8
9# Define a pattern using basic regular expression symbols
10pattern = r"^\w+\s\d+\s[a-zA-Z]+$"
11
12# Example text to test the pattern
13text = "Room 23 Tokyo"
14
15# Check if the pattern matches the text
16result = re.match(pattern, text)
17if result:
18 print("Matched:", result.group())
19else:
20 print("No match")- 이 코드는 먼저 문자열이 우편번호 패턴과 일치하는지 확인합니다. 다음으로, 문자열 전체(시작부터 끝까지)가 단어, 공백, 숫자, 공백, 영어 단어로 이루어진 패턴과 일치하는지 확인합니다. 이를 통해 정규 표현식의 기본 요소들을 어떻게 결합할 수 있는지 이해할 수 있습니다.
매칭 함수 사용 방법
re.match()
re.match()는 문자열의 시작이 지정된 패턴과 일치하는지 확인합니다.
1import re
2
3pattern = r"\w+"
4text = "Python is powerful"
5match = re.match(pattern, text)
6if match:
7 print(match.group()) # Output: Python- 이 코드는 문자열이 단어 문자(영숫자 또는 밑줄)로 시작하는지 확인합니다. 첫 번째 단어 'Python'이 패턴과 일치하여 출력됩니다.
re.search()
re.search()는 문자열 전체를 검색하고 첫 번째 일치 항목을 반환합니다.
1import re
2
3pattern = r"powerful"
4text = "Python is powerful and versatile"
5search = re.search(pattern, text)
6if search:
7 print(search.group()) # Output: powerful- 이 코드는 문자열 전체에서 'powerful'이라는 단어를 찾아 첫 번째 일치를 반환합니다. 그 결과,
re.search()는 일치한 문자열 'powerful'을 출력합니다.
re.findall()
re.findall()은 패턴에 일치하는 모든 항목을 리스트로 반환합니다.
1import re
2
3pattern = r"\b\w{6}\b"
4text = "Python is powerful and versatile"
5matches = re.findall(pattern, text)
6print(matches) # Output: ['Python', 'strong']- 이 코드는 정확히 6글자인 모든 단어를 찾아 리스트로 반환합니다. 'Python'이 조건과 일치하여 리스트
['Python']이 출력됩니다.
re.finditer()
re.finditer()는 모든 일치 항목을 이터레이터(iter)로 반환하며, 각 일치 항목에 대한 세부 정보를 검색할 수 있게 해줍니다.
1import re
2
3pattern = r"\b\w{6}\b"
4text = "Python is powerful and versatile"
5matches = re.finditer(pattern, text)
6for match in matches:
7 print(match.group()) # Output: Python- 이 코드는 6글자 단어를 순차적으로 찾아 이터레이터를 통해 각 일치를 처리합니다. 여기서 'Python'이 패턴과 일치하여 출력됩니다.
치환 및 분할
re.sub()
re.sub()는 정규식과 일치하는 문자열 부분을 다른 문자열로 대체합니다.
1import re
2
3pattern = r"\d+"
4text = "There are 100 apples"
5new_text = re.sub(pattern, "many", text)
6print(new_text) # Output: There are many apples- 이 코드는 문자열의 모든 숫자를 'many'로 대체합니다.
re.split()
re.split()는 정규식과 일치하는 부분에서 문자열을 분할합니다.
1import re
2
3pattern = r"\s+"
4text = "Python is powerful"
5parts = re.split(pattern, text)
6print(parts) # Output: ['Python', 'is', 'powerful']- 이 코드는 하나 이상의 공백 문자를 기준으로 문자열을 분리합니다. 그 결과 문자열은 단어 단위로 분리되어
['Python', 'is', 'powerful']가 됩니다.
그룹 및 캡처
정규식 그룹화를 사용하면 매칭된 하위 문자열을 쉽게 추출할 수 있습니다. 괄호 ()로 묶으면 이를 그룹으로 캡처합니다.
1import re
2
3pattern = r"(\d{3})-(\d{4})"
4text = "My postal code is 123-4567."
5match = re.search(pattern, text)
6if match:
7 print(match.group(1)) # Output: 123
8 print(match.group(2)) # Output: 4567- 이 코드는 '123-4567' 형식의 우편번호에서 3자리와 4자리 숫자를 각각 별도의 그룹으로 추출합니다.
group(1)은 처음 세 자리 '123'을 반환하고,group(2)는 마지막 네 자리 '4567'을 반환합니다.
명명된 그룹
명명된 그룹을 사용하면 인덱스에 의존하지 않고 의미 있는 이름으로 값을 가져올 수 있습니다. 다음은 로그에서 날짜와 레벨을 추출하는 구체적인 예입니다.
1import re
2
3log = "2025-10-25 14:00:01 [ERROR] Something failed"
4
5pattern = r"(?P<date>\d{4}-\d{2}-\d{2}) (?P<time>\d{2}:\d{2}:\d{2}) \[(?P<level>[A-Z]+)\] (?P<msg>.*)"
6m = re.search(pattern, log)
7if m:
8 print(m.group("date"), m.group("time"), m.group("level"))
9 print("message:", m.group("msg"))- 이 코드는 명명된 그룹을 사용하여 로그 문자열에서 날짜, 시간, 레벨, 메시지를 추출합니다. 인덱스 대신 의미 있는 이름으로 값을 가져옵니다.
플래그 옵션 사용하기
re 모듈에는 검색 동작을 제어할 수 있는 여러 플래그 옵션이 있습니다.
re.IGNORECASE(re.I): 매칭 시 대소문자를 구분하지 않게 해주는 플래그 옵션입니다.re.MULTILINE(re.M): 여러 줄에 걸쳐 매칭할 수 있도록 해주는 플래그 옵션입니다.re.DOTALL(re.S): 점.문자가 개행 문자까지 매칭하게 해주는 플래그 옵션입니다.
1import re
2
3pattern = r"python"
4text = "Python is powerful"
5match = re.search(pattern, text, re.IGNORECASE)
6if match:
7 print(match.group()) # Output: Python- 이 코드는 대소문자를 구분하지 않고 'python'이라는 단어를 검색합니다.
re.IGNORECASE플래그를 사용하면 'Python'도 일치합니다.
정규식 객체(re.compile)의 장점
re.compile로 패턴을 컴파일하면 재사용이 더 효율적이며 가독성이 향상됩니다. 여기서 플래그도 설정할 수 있습니다.
다음 예시는 컴파일된 패턴을 사용하여 여러 줄에 걸쳐 반복적으로 일치를 검색합니다. 같은 패턴을 자주 사용한다면 re.compile로 컴파일하는 것이 성능을 향상시킵니다.
1import re
2
3pattern = re.compile(r"User: (\w+), ID: (\d+)")
4text = "User: alice, ID: 1\nUser: bob, ID: 2"
5
6for m in pattern.finditer(text):
7 print(m.groups())- 이 코드는 컴파일된 정규식을 사용해 여러 줄에서 사용자명과 ID를 추출합니다.
re.compile은 동일한 패턴을 재사용할 때 효율을 높이고 코드의 가독성도 향상시킵니다.
응용 프로그램
예를 들어, 텍스트 파일에서 모든 이메일 주소를 추출하는 스크립트를 생각해 봅시다.
1import re
2
3pattern = r"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}"
4text = "Contact us at info@example.com or support@service.com."
5emails = re.findall(pattern, text)
6print(emails) # Output: ['info@example.com', 'support@service.com']- 이 코드는 문자열에서 모든 이메일 주소를 찾아 리스트로 추출합니다.
결론
re 모듈은 Python에서 문자열을 조작하기 위한 강력한 도구입니다. 여기에서는 기본 사용법부터 그룹화 및 플래그 옵션을 활용한 고급 정규식까지를 폭넓게 다뤘습니다. 파이썬의 정규표현식은 매우 강력하며 텍스트 처리에 필수적인 도구입니다.
위의 기사를 보면서 Visual Studio Code를 사용해 우리 유튜브 채널에서 함께 따라할 수 있습니다. 유튜브 채널도 확인해 주세요.