개발노트

파이썬 정규표현식 사용법과 예제

Happy._. 2025. 6. 21. 15:46
반응형
반응형

정규표현식은 문자열에서 특정한 규칙을 가진 패턴을 찾거나 바꾸기 위한 표현 방법이다.

파이썬의 re 모듈은 정규표현식을 쉽게 다룰 수 있도록 다양한 함수 제공한다.

 

자주 쓰이는 함수

  • re.match: 문자열 시작부터 패턴 확인
  • re.search: 문자열 전체에서 검색
  • re.findall: 매칭되는 모든 결과를 리스트로 반환
  • re.sub: 문자열 치환
  • re.compile: 패턴을 재사용 가능한 객체로 컴파일

 

정규표현식 모듈(re)를 사용하기 위해서는 상단에 임포트 해야 함

import re # 정규표현식 모듈
 

 

re.match(패턴, 문자열)

  • 문자열의 처음부터 정규표현식과 매칭되는지 확인(대소문자 구분)
example = '과일의 색상 (사과, 빨강), (바나나, 노랑), (포도, 보라)'

pattern = '과일'
result = re.match(pattern, example) # <re.Match object; span=(0, 2), match='과일'>
print(result.group()) # 과일

pattern = '색상'
result = re.match(pattern, example) # None
print(result) # None
 

 

re.search(패턴, 문자열)

  • 문자열 전체에서 정규표현식과 매칭되는지 확인
example = '과일의 색상 (사과, 빨강), (바나나, 노랑), (포도, 보라)'

pattern = '색상'
result = re.search(pattern, example) # <re.Match object; span=(7, 9), match='색상'>
print(result.group()) # 색상

pattern = '사과'
result = re.search(pattern, example) # <re.Match object; span=(12, 14), match='사과'>
print(result.group()) # 사과
 

 

re.findall(패턴, 문자열)

  • 문자열에서 정규표현식과 매칭되는 모든 부분을 리스트로 반환
example = '과일의 색상 (사과, 빨강), (바나나, 노랑), (포도 보라)'

pattern = r'\((.*?)\)' # (0개 이상의 문자 포함)
result = re.findall(pattern, example) # ['사과, 빨강', '바나나, 노랑', '포도 보라']
print(result[0]) # 사과, 빨강

pattern = r'\((.+?), (.+?)\)' #((첫 번째 그룹), (두 번째 그룹)) => 쉼표로 구분
result = re.findall(pattern, example) # [('사과', '빨강'), ('바나나', '노랑')]
print(result[0]) # ('사과', '빨강')
 

 

re.split(패턴, 문자열)

  • 문자열을 정규표현식으로 분리하여 리스트로 반환
example = '과일의 색상 (사과, 빨간색), (바나나, 노란색), (포도, 보라색)'

result = re.split(r'\s', example) # 공백, \t, \n, \r, \f, \v로 구분
print(result)  # ['과일의', '색상', '(사과,', '빨간색),', '(바나나,', '노란색),', '(포도,', '보라색)']
 

 

re.sub(찾을 패턴, 대체할 문자, 찾을 문자열)

  • 문자열에서 정규표현식과 매칭되는 부분다른 문자열로 대체
example = '과일의 색상 (사과, 빨간색), (바나나, 노란색), (포도, 보라색)'

pattern = r'[()]' # 괄호를 찾는 정규표현식
result = re.sub(pattern, '' , example) # 괄호를 빈 문자열로 치환하여 제거
print(result) # '과일의 색상 사과, 빨간색, 바나나, 노란색, 포도, 보라색'
 

 

re.compile(패턴)

  • 정규표현식을 컴파일하여 패턴 객체 생성

장점

  • 정규표현식 재사용 가능: 같은 패턴을 반복해서 사용할 때 성능 향상
  • 코드 가독성 증가: 정규식 패턴을 따로 저장해서 직관적으로 사용 가능
  • 속도 최적화: 런타임에 정규식을 반복 생성할 필요 없이 미리 컴파일된 객체 사용(복잡한 정규표현식 반복 실행 시 유리)

단점

  • 단순한 경우 불필요: 간단한 정규식을 한두 번만 사용하는 경우
  • 관리해야 할 객체가 늘어남
  • 간단한 정규표현식에서 성능 차이 미미: 단순한 표현식의 경우 직접 사용과 성능 차이가 거의 없음
example = '1월, 2월, 3월, 4월, 5월, 6월, 7월, 8월, 9월, 10월, 11월, 12월'

pattern = re.compile(r'\d+') # \d+ : 숫자 1개 이상
result = pattern.findall(example)
print(result) # ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12']
 

 

re.finditer(패턴, 문자열)

  • 문자열에서 정규표현식과 매칭되는 모든 부분을 반복 가능(iterator)한 Match 객체 반환
example = '1월 2일, 3월 4일, 5월 6일, 7월 8일, 9월 10일, 11월 12일'

pattern = re.finditer(r'(\d+)월 (\d+)일', example) # 괄호()를 사용하여 월과 일을 각각 캡처 그룹으로 지정

for match in pattern:
    print(match) # 매칭 객체: <re.Match object; span=(0, 5), match='1월 2일'>
    print(match.group()) # 전체 매칭: 1월 2일
    print(match.group(1)) # 첫 번째 그룹(월): 1
    print(match.group(2)) # 두 번째 그룹(일): 2
    print(match.group(3)) # IndexError: no such group
    print(match.start()) # 시작 위치: 0
    print(match.end()) # 끝 위치: 5
    print(match.span()) # (시작 위치, 끝 위치): (0, 5)
    print(match.groups()) # 매칭된 그룹: ('1', '2')
 

 

패턴을 찾는 정규표현식

\d: 숫자와 매치, [0-9]와 같음
    \d{n}: 숫자를 n번 반복한 값
\D: 숫자가 아닌 것과 매치, [^0-9]와 같음
\s: whitespace 문자와 매치, [ \t\n\r\f\v]와 같음, 맨 앞의 빈칸은 공백을 의미
\S: whitespace 문자가 아닌 것과 매치, [^ \t\n\r\f\v]와 같음
\w: 문자+숫자와 매치, [a-zA-Z0-9_]와 같음
\W: 문자+숫자가 아닌 문자와 매치, [^a-zA-Z0-9_와 같음
\\: 메타 문자가 아닌 일반 문자 역슬래시(\)와 매치, 매타 문자 앞에 \를 붙이면 일반 문자를 의미
 

 

그외 패턴

\(, \): 여는 괄호, 닫는 괄호
+: 하나 이상의 문자, 단독으로 사용 X, \d+, \w+ 등과 함께 사용
   .+: 가능한 많은 문자 매칭(greedy)
   .+?: 가능한 적은 문자 매칭(lazy)
?: 0개 또는 1개
 

 

 

반응형