개발노트
파이썬 정규표현식 사용법과 예제
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개
반응형