WeniVooks

검색

정규표현식 톺아보기 with JavaScript and Python

Python에서의 정규표현식 활용

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 기본 실습
  1. 주어진 텍스트에서 모든 URL을 추출하세요.
  2. 괄호로 둘러싸인 내용을 추출하세요.
  3. 한글로 된 단어만 추출하세요.
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))
2.1 JavaScript에서의 정규표현식 활용3장 실전 프로젝트