본문 바로가기
Python/퀀트

문자열 처리를 위한 정규 표현식

by 훈영 2024. 11. 5.

1. 정규 표현식
- 정규 표현식(정규식)이란 프로그래밍에서 문자열을 다룰 때 문자열의 일정한 패턴을 표현하는 일종의 형식 언어
- regular expression을 줄여 일반적으로 regex라 표현
- 정규 표현식은 파이썬만의 고유 문법이 아니라 문자열을 처리하는 모든 프로그래밍에서 사용되는 공통 문법

 

2. 정규 표현식 활용

[ '동 기업의 매출액은 전년 대비 29.2% 늘어났습니다.' ] 라는 문장에서 '29.2%'를 추출해보자.

import re

data = '동 기업의 매출액은 전년 대비 29.2% 늘어났습니다.'
re.findall('\d + .\d + %', data)


3. 정규 표현식의 종류
- 대괄호([ ])는 문자 클래스로써 대괄호 안에 포함된 문자들 중 하나와 매치를 뜻함
- 'apple', 'blueberry', 'coconut'이 정규 표현식이 [ae]와 매치 여부

- 'apple'에는 정규 표현식 내의 a와 e가 모두 존재하므로 매치됨
- 'blueberry'에는 e가 존재하므로 매치됨
- 'coconut'에는 a와 e 중 어느 문자도 포함하고 있지 않으므로 매치되지 않음

- 만일 [ ] 안의 두 문자 사이에 하이픈(-)을 입력하면 두 문자 사이의 범위를 의미
- [a-e]라는 정규 표현식은 [abcde]와 동일하며,
- [0-5]는 [012345]와 동일

- [a-z]는 알파벳 소문자를, [A-Z]는 알파벳 대문자를, [a-zA-Z]는 모든 알파벳을, [0-9]는 모든 숫자를 뜻함

- [ ] 안의 ^는 반대를 뜻함
- [^0-9]는 숫자를 제외한 문자만 매치를, [^abc]는 a, b, c를 제외한 모든 문자와 매치를 뜻함

 

정규 표현식 내용
\d  숫자와 매치, [0-9]와 동일한 표현식
\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]와 동일

* 대문자로 표현된 문자 클래스는 소문자로 표현된 것의 반대

 

4. 정규 표현식과 관련된 메서드

- match() : 시작 부분부터 일치하는 패턴을 찾음

- search() : 첫 번째 일치하는 패턴을 찾음

- findall() : 일치하는 모든 패턴을 찾음

- finditer() : findall()과 동일하지만 반복 가능한 객체를 반환

 

5. 정규 표현식 메서드 활용

import re

# re.compile()을 통해 정규 표현식을 컴파일하여 변수에 저장한 후 사용할 수 있음
p = re.compile('[a-z]+')  # 모든 소문자
type(p)

m = p.match('python')
m
m.group()  # 매치된 단어만 추출

# 대문자('U')로 시작하므로 매치되지 않음
print(p.match('Use python'))
print(p.match('PYTHON'))

p = re.compile('[A-Z]+')  # 모든 대문자
p.match('PYTHON')

p = re.compile('[가-힣]+')  # 모든 한글
m = p.match('파이썬')
m

p = re.compile('[a-z]+')  # 모든 소문자
m = p.search('python')
m = p.search('Use python')
print(m)

p = re.compile('[a-zA-Z]+')  # 모든 알파벳
m = p.findall('Life is too short, You need Python')
print(m)  # '.'이나 ','는 매치되지 않음

# 반복 가능한 객체를 반환
p = re.compile('[a-zA-Z]+')  # 모든 알파벳
m = p.finditer('Life is too short, You need Python')
print(m)

# for문을 통해 하나씩 출력 가능
for i in m:
    print(i)

 

import re

# 로또 번호 추출
num = """r\n\t\t\t\t\t15\t\t\t23\t\t\t29\r\n\t\t34\r\n\t\t40\r\t\t44\r"""

p = re.compile('[0-9]+')  # 모든 숫자
m = p.findall(num)
print(m)  # 당첨 번호에 해당하는 숫자만 추출


# 날짜 추출
dt = '> 오늘의 날짜는 2022.12.31 입니다.'

p = re.compile('[0-9]+.[0-9]+.[0-9]+')  # 숫자.숫자.숫자
m = p.findall(dt)
print(m)

p = re.compile('[0-9]+')  # 숫자
m = p.findall(dt)
print(m)
'.'.join(m)

댓글