1. Python의 정규표현식 기초
1.1 re 모듈
1.1.1 기본 import와 사용법
import re
# 기본 패턴 매칭
pattern = re.compile(r'hello')
text = 'hello world'
result = pattern.match(text)
import re
# 기본 패턴 매칭
pattern = re.compile(r'hello')
text = 'hello world'
result = pattern.match(text)
1.1.2 raw 문자열 (r'') 사용
# raw 문자열을 사용하지 않은 경우
pattern1 = '\\d+' # 백슬래시를 이스케이프하기 위해 두 번 써야 함
# raw 문자열을 사용한 경우
pattern2 = r'\d+' # 더 깔끔하고 실수를 줄일 수 있음
# raw 문자열을 사용하지 않은 경우
pattern1 = '\\d+' # 백슬래시를 이스케이프하기 위해 두 번 써야 함
# raw 문자열을 사용한 경우
pattern2 = r'\d+' # 더 깔끔하고 실수를 줄일 수 있음
1.2 컴파일 플래그
1.2.1 주요 플래그
re.IGNORECASE # 또는 re.I: 대소문자 구분 없음
re.MULTILINE # 또는 re.M: 다중 행 모드
re.DOTALL # 또는 re.S: .이 개행 문자도 매칭
re.VERBOSE # 또는 re.X: 상세 모드 (공백과 주석 허용)
re.IGNORECASE # 또는 re.I: 대소문자 구분 없음
re.MULTILINE # 또는 re.M: 다중 행 모드
re.DOTALL # 또는 re.S: .이 개행 문자도 매칭
re.VERBOSE # 또는 re.X: 상세 모드 (공백과 주석 허용)
1.2.2 플래그 조합
pattern = re.compile(r'hello', re.IGNORECASE | re.MULTILINE)
pattern = re.compile(r'hello', re.IGNORECASE | re.MULTILINE)
2. 기본 메서드
2.1 검색 메서드
2.1.1 match()와 search()
text = "hello world"
pattern = re.compile(r'world')
# match()는 문자열 시작부터 검색
match_result = pattern.match(text) # None
# search()는 문자열 전체에서 검색
search_result = pattern.search(text) # <re.Match object>
text = "hello world"
pattern = re.compile(r'world')
# match()는 문자열 시작부터 검색
match_result = pattern.match(text) # None
# search()는 문자열 전체에서 검색
search_result = pattern.search(text) # <re.Match object>
2.1.2 findall()과 finditer()
text = "hello world hello"
pattern = re.compile(r'\w+')
# findall()은 모든 매칭을 리스트로 반환
words = pattern.findall(text) # ['hello', 'world', 'hello']
# finditer()는 이터레이터 반환
for match in pattern.finditer(text):
print(f"Found '{match.group()}' at position {match.start()}-{match.end()}")
text = "hello world hello"
pattern = re.compile(r'\w+')
# findall()은 모든 매칭을 리스트로 반환
words = pattern.findall(text) # ['hello', 'world', 'hello']
# finditer()는 이터레이터 반환
for match in pattern.finditer(text):
print(f"Found '{match.group()}' at position {match.start()}-{match.end()}")
2.2 문자열 처리 메서드
2.2.1 sub() 메서드
text = "hello world"
pattern = re.compile(r'o')
result = pattern.sub('0', text) # 'hell0 w0rld'
text = "hello world"
pattern = re.compile(r'o')
result = pattern.sub('0', text) # 'hell0 w0rld'
2.2.2 split() 메서드
text = "hello,world;hi"
result = re.split(r'[,;]', text) # ['hello', 'world', 'hi']
text = "hello,world;hi"
result = re.split(r'[,;]', text) # ['hello', 'world', 'hi']
3. 실전 예제
3.1 이메일 주소 추출
def extract_emails(text):
pattern = re.compile(r'[\w.-]+@[\w.-]+\.\w+')
return pattern.findall(text)
# 실습:
text = """
paul-korea@naver.com
paul@naver.com
leehojun@gmail.com
test.test@go.go.go
"""
print(extract_emails(text))
def extract_emails(text):
pattern = re.compile(r'[\w.-]+@[\w.-]+\.\w+')
return pattern.findall(text)
# 실습:
text = """
paul-korea@naver.com
paul@naver.com
leehojun@gmail.com
test.test@go.go.go
"""
print(extract_emails(text))
3.2 전화번호 형식화
def format_phone_number(number):
# 숫자만 추출
cleaned = re.sub(r'\D', '', number)
pattern = re.compile(r'^(\d{3})(\d{4})(\d{4})$')
match = pattern.match(cleaned)
if match:
return f"{match.group(1)}-{match.group(2)}-{match.group(3)}"
return None
# 실습:
numbers = [
"010-9091-5491",
"01019133829",
"010.1913.3829"
]
for number in numbers:
print(format_phone_number(number))
def format_phone_number(number):
# 숫자만 추출
cleaned = re.sub(r'\D', '', number)
pattern = re.compile(r'^(\d{3})(\d{4})(\d{4})$')
match = pattern.match(cleaned)
if match:
return f"{match.group(1)}-{match.group(2)}-{match.group(3)}"
return None
# 실습:
numbers = [
"010-9091-5491",
"01019133829",
"010.1913.3829"
]
for number in numbers:
print(format_phone_number(number))
4. 고급 기능
4.1 이름 있는 그룹
pattern = re.compile(r'(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})')
match = pattern.match("2024-11-02")
if match:
print(match.group('year')) # 2024
print(match.group('month')) # 11
print(match.group('day')) # 02
pattern = re.compile(r'(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})')
match = pattern.match("2024-11-02")
if match:
print(match.group('year')) # 2024
print(match.group('month')) # 11
print(match.group('day')) # 02
4.2 전방탐색과 후방탐색
# 긍정 전방탐색
pattern1 = re.compile(r'hello(?=\sworld)') # hello 뒤에 world가 있는 경우
# 부정 전방탐색
pattern2 = re.compile(r'hello(?!\sworld)') # hello 뒤에 world가 없는 경우
# 긍정 전방탐색
pattern1 = re.compile(r'hello(?=\sworld)') # hello 뒤에 world가 있는 경우
# 부정 전방탐색
pattern2 = re.compile(r'hello(?!\sworld)') # hello 뒤에 world가 없는 경우
5. 실습 문제
5.1 기본 실습
- 주어진 텍스트에서 모든 URL을 추출하세요.
- 괄호로 둘러싸인 내용을 추출하세요.
- 한글로 된 단어만 추출하세요.
5.2 심화 실습
# 실습 1: URL 추출
text = """
https://github.com/LiveCoronaDetector/livecod
github.com/LiveCoronaDetector/livecod
https://github.com/LiveCoronaDetector
"""
pattern = re.compile(r'https?://[^\s]+|(?:[\w-]+\.)+[\w-]+/\S+')
print(pattern.findall(text))
# 실습 2: 괄호 내용 추출
text = "[(name, leehojun), (age, 10), (height, 180)]"
pattern = re.compile(r'\(([^)]+)\)')
print(pattern.findall(text))
# 실습 3: 한글 단어 추출
text = "안녕하세요 hello 반갑습니다 world"
pattern = re.compile(r'[가-힣]+')
print(pattern.findall(text))
# 실습 1: URL 추출
text = """
https://github.com/LiveCoronaDetector/livecod
github.com/LiveCoronaDetector/livecod
https://github.com/LiveCoronaDetector
"""
pattern = re.compile(r'https?://[^\s]+|(?:[\w-]+\.)+[\w-]+/\S+')
print(pattern.findall(text))
# 실습 2: 괄호 내용 추출
text = "[(name, leehojun), (age, 10), (height, 180)]"
pattern = re.compile(r'\(([^)]+)\)')
print(pattern.findall(text))
# 실습 3: 한글 단어 추출
text = "안녕하세요 hello 반갑습니다 world"
pattern = re.compile(r'[가-힣]+')
print(pattern.findall(text))