정규 표현식은 문자열을 처리하거나 검색할 때 특정 패턴에 맞는 부분을 찾는 데 사용됩니다. 예를 들어, 파일 이름에서 와일드카드(*와 ?)를 사용한 것과 유사하지만, 더 강력하고 정확한 텍스트 매칭이 가능합니다. Python에서는 re 모듈을 통해 정규 표현식을 지원합니다.
기본 문법 요약
아래 표는 정규 표현식의 기본적인 기호와 그 설명입니다.| 기호 | 설명 | 예시 | 설명 |
|---|---|---|---|
| . | 모든 문자 일치 | b.t | bat, b1t 등과 일치 |
| \w | 알파벳/숫자/밑줄 일치 | b\wt | b1t, b_t와 일치 |
| \d | 숫자 일치 | \d\d | 01, 23 등과 일치 |
| * | 0회 이상 반복 | \w* | 문자, 숫자 또는 밑줄 0개 이상 |
| + | 1회 이상 반복 | \w+ | 문자, 숫자 또는 밑줄 1개 이상 |
| {n} | 정확히 n번 반복 | \w{3} | 문자, 숫자 또는 밑줄 3개 |
re 모듈 함수
Python의 re 모듈에는 다음과 같은 핵심 함수들이 있습니다:| 함수 | 설명 |
|---|---|
| compile(pattern) | 정규 표현식 컴파일 |
| match(pattern, string) | 처음부터 일치 확인 |
| search(pattern, string) | 처음으로 일치하는 부분 찾기 |
| findall(pattern, string) | 모든 일치 항목 찾기 |
| sub(pattern, repl, string) | 패턴 일치하는 부분 치환 |
예제 실습
실습 1: 사용자 이름 및 QQ 번호 유효성 검사
사용자 이름은 알파벳, 숫자 또는 밑줄로 구성되며 길이는 6~20자 사이여야 합니다. QQ 번호는 첫 글자가 0이 아닌 5~12자의 숫자여야 합니다.
import re
def validate():
name = input("사용자 이름 입력: ")
qq = input("QQ 번호 입력: ")
name_pattern = r'^[a-zA-Z0-9_]{6,20}$'
qq_pattern = r'^[1-9]\d{4,11}$'
if re.match(name_pattern, name):
print("유효한 사용자 이름입니다.")
else:
print("잘못된 사용자 이름입니다.")
if re.match(qq_pattern, qq):
print("유효한 QQ 번호입니다.")
else:
print("잘못된 QQ 번호입니다.")
validate()
실습 2: 텍스트에서 중국 내 휴대전화 번호 추출
다음 텍스트에서 중국 내 핸드폰 번호를 찾아보겠습니다:
import re
text = '''
중요한 일을 8130123456789번 말해봅시다. 제 전화번호는 13512346789이고,
이건 아닙니다 15600998765. 비상전화는 110이나 119입니다.
'''
phone_pattern = re.compile(r'(?:\D)(1[34578]\d{9})(?:\D)')
phones = re.findall(phone_pattern, text)
print(phones)
실습 3: 부적절한 단어 필터링
주어진 텍스트에서 부적절한 단어를 *로 대체합니다:
import re
sentence = "너는 바보냐? 나도 너의 할아버지를 *. F**k you."
cleaned_sentence = re.sub(r'[操肏艹]|fuck|shit|바보[비병]', '*', sentence, flags=re.IGNORECASE)
print(cleaned_sentence)
실습 4: 시 구분하기
시를 구분하여 각 문장을 리스트로 출력합니다:
import re
poem = '창밖의 달빛, 의심스러운 서리. 고개 들고 밝은 달을 보고, 고개 숙여 고향 생각.'
sentences = re.split(r'[,。]', poem)
filtered_sentences = [s for s in sentences if s]
print(filtered_sentences)