
1-1. 문자열 다루기에서 정규표현식이 중요한 이유
split(), replace() 같은 기본 함수로 해결할 수 있지만, 복잡한 패턴을 다룰 때는 코드가 길어지고 복잡해짐.1-2. 예제 문제: 전화번호 가운데 자리 숨기기
import re
text = '''
Elice 123456-1234567 010-1234-5678
Cheshire 345678-678901 01098765432
'''
# 전화번호 패턴을 찾아 가운데 숫자를 '*'로 변경
masked_text = re.sub(r'(\d{3,4})-(\d{4})-(\d{4})', r'\1-****-\3', text)
print(masked_text)
re.sub(pattern, replace, text): 특정 패턴을 찾아 변경하는 함수.(\d{3,4})-(\d{4})-(\d{4}) → 전화번호 패턴을 정의 (3~4자리 숫자)-(4자리 숫자)-(4자리 숫자)\1, \3 → 그룹핑을 활용해 첫 번째, 세 번째 그룹은 그대로 유지하고 두 번째 그룹만 ***로 변경.2-1. 메타 문자의 개념
2-2. 주요 메타 문자
| 메타 문자 | 의미 | 예시 |
|---|---|---|
^ | 문자열 시작 | ^www → www로 시작하는 문자열 찾기 |
$ | 문자열 끝 | .com$ → .com으로 끝나는 문자열 찾기 |
| ` | ` | OR 조건 |
[] | 문자 클래스 | [abc] → 'a', 'b', 'c' 중 하나와 매칭 |
\d | 숫자 | \d+ → 숫자 하나 이상 찾기 |
\D | 숫자가 아닌 문자 | \D+ → 숫자가 아닌 문자 찾기 |
\w | 알파벳, 숫자, _ | \w+ → 단어 찾기 |
\W | 특수문자 | \W+ → 특수문자 찾기 |
\s | 공백 문자 | \s+ → 공백 찾기 |
\S | 공백이 아닌 문자 | \S+ → 공백이 아닌 문자 찾기 |
. | 모든 문자 | a.b → a와 b 사이에 한 글자 있는 경우 |
2-3. 메타 문자 예제
import re
text = "apple banana orange"
pattern = r"b.n"
match = re.findall(pattern, text)
print(match) # ['ban']
b.n → b와 n 사이에 아무 문자나 하나 있는 단어 찾기3-1. 수량자의 개념
3-2. 주요 수량자
| 수량자 | 의미 | 예시 |
|---|---|---|
* | 0개 이상 | elice* → "elic", "elice", "elicee" 가능 |
+ | 1개 이상 | elice+ → "elice", "elicee" 가능 (하지만 "elic"는 안 됨) |
? | 0개 또는 1개 | elice? → "elic", "elice" 가능 |
{n} | 정확히 n개 | \d{3} → 숫자 3개 연속 |
{n, m} | n개 이상 m개 이하 | \w{3,5} → 3~5글자 단어 찾기 |
{n,} | n개 이상 | a{4,} → a가 4개 이상 |
3-3. 수량자 예제
import re
text = "helloooo world!"
pattern = r"o{2,}"
match = re.findall(pattern, text)
print(match) # ['oooo']
o{2,} → "o"가 2개 이상 연속된 부분 찾기4-1. 그룹의 개념
()를 사용해 하나의 패턴을 그룹으로 묶을 수 있음.|(OR)와 함께 사용 가능.4-2. 그룹을 활용한 패턴 예제
import re
text = "elice alice tomato potato"
pattern = r"(e|a)lice"
match = re.findall(pattern, text)
print(match) # ['e', 'a']
(e|a)lice → elice, alice 둘 다 찾을 수 있음.4-3. 그룹 재사용 예제
import re
text = "tomato potato"
pattern = r"(to)ma\\1"
match = re.findall(pattern, text)
print(match) # ['to']
(to)를 그룹으로 저장하고, 뒤에서 \\1로 재사용 가능.