정규표현식
- Python에서만 사용한 기능이 아니라, 문자열을 다룰 수 있는 곳에서 공통적으로 사용됨
- 정규식 사용 예시
1. 전화번호 뒷자리 마스킹
p1 = '아이유: 010-1234-5678 송하예: 010-9876-5432'
# 전화번호 뒷자리 xxxx로 변환
import re
re.sub('(\d{3}[-]\d{4})([-]\d{4})', '\g<1>-XXXX', p1)
'아이유: 010-1234-XXXX 송하예: 010-9876-XXXX'
=> re.sub(바꿀 문자열(정규 표현식), 바꿀 문자열, 문자열(변수) 이름)
=> \d{3} : 숫자 3자리 -- digit{3}
=> \g<1> : 첫 소괄호 -- (\d{3}[-]\d{4})
=> 숫자 3자리-4자리-4자리 문자열을 갖고 있는 변수 p1에서 뒷자리를 xxxx 형태로 변경하고자 함.
2. 주민번호 뒷자리 마스킹
# 이름과 주민번호가 섞여 있는 문자열
p2 = '소지섭: 760405-1049234 김우빈: 800104-1052114'
# 주민번호 뒷자리 숨기기
import re
re.sub('(\d{6})[-](\d{7})', '\g<1>-*******', p2)
'아이유: 760405-******* 김우빈: 800104-*******'
=> \d{6} : 숫자 6자리 -- digit{3}
=> \g<1> : 첫 소괄호 -- (\d{6})
=> 숫자 6자리-7자리 문자열을 갖고 있는 변수 p2에서 뒷자리를 ******* 형태로 변경하고자 함.
- 말로 설명하는 것도 어려움... 나중에 제대로 공부해 봐야겠다. 지금은 이해한 내용으로 복습 진행!
- 정규표현식 관련 함수
- match() : 문자열 처음부터 정규식과 매치 여부 확인
s1 = 'I want to do well'
re.match('I', s1)
<re.Match object; span=(0, 1), match='I'>
=> 0부터 1까지 검색했고 매치된 문자열은 'I'이다.
=> match() 처음부터 매칭이 돼야함
- search() : 문자열 전체를 대상으로 정규식과 매치 여부 확인
s1 = 'I want to do well'
re.search('to', s1)
<re.Match object; span=(7, 9), match='to'>
=> 인덱스 7부터 9까지에 문자열 to가 있다.
=> 특정 문자열의 위치를 찾기 위해 사용함
- 매치된 결과 확인할 수 있는 메소드
- group() : 매치된 문자열 반환
- start() : 매치된 문자열 시작 위치 반환
- end() : 매치된 문자열 끝 위치 반환
- span() : 매치된 문자열의 (시작, 끝)에 해당하는 튜플 반환
s1 = 'I want to do well'
result = re.search('to', s1)
print(result.group())
print(result.start())
print(result.end())
print(result.span())
to
7
9
(7, 9)
=> group() : to와 매치된 s1 문자열의 to를 반환
=> start() : to와 매치된 s1 문자열의 시작 위치는 7임
=> end() : to와 매치된 s1 문자열의 끝 위치는 9(인덱스:8)임
=> span() : (7, 9) : (시작 위치, 끝 위치)
- findall() : 정규식과 매치되는 모든 문자열을 리스트 형태로 반환
s1 = 'I want to do well'
re.findall('w', s1)
['w', 'w']
- 문자 찾기
s1 = 'I want to do well'
re.findall('[wt]', s1)
['w', 't', 't', 'w']
=> 리스트에 있는 문차 찾아서 리스트로 출력
- 문자 제거
s1 = 'I want to do well'
re.sub('[wt]','', s1)
'I ve Dre.'
=> 특정 문자 제거
- 특정 문자 제외한 문자 찾기
s1 = 'I want to do well'
result = list(set(re.findall('[^wt]', s1))) # ^ : 반대의미
print(result)
['o', 'd', 'n', 'a', 'I', ' ', 'l', 'e']
- 범위 안에 해당하는 문자 확인
# a ~ i 범위에 해당하는 문자 찾기
s1 = 'I want to do well'
re.findall('[a-i]', s1)
['a', 'd', 'e']
# a ~ i 범위에 해당하는 문자 찾기, 대문자 포함
s1 = 'I want to do well'
re.findall('[a-iA-I]', s1)
['I', 'a', 'd', 'e']
# a ~ i 범위에 해당하는 문자 제외하고 찾기
s1 = 'I want to do well'
re.findall('[^a-iA-I]', s1)
[' ', 'w', 'n', 't', ' ', 't', 'o', ' ', 'o', ' ', 'w', 'l', 'l']
# 0 ~ 9 에 해당하는 숫자 찾기
s2 = 'hello 2023'
re.findall('[0-9]', s2)
['2', '0', '2', '3']
- 두 문자 사이의 포함하는 문자 확인
# w와 n 사이에 문자 하나를 포함하는 문자열 확인
s1 = 'I want to do well'
re.findall('w.n', s1)
['wan']
=> . 하나당 문자 하나
# w와 n 사이에 문자 두개를 포함하는 문자열 확인
s1 = 'I want to do well'
re.findall('w..t', s1)
['want']
- 반복하는 문자 확인
# o가 0회 이상 반복된 경우
s3 = 'gd god good goood goooood gooooooood'
re.findall('go*d', s3)
['gd', 'god', 'good', 'goood', 'goooood', 'gooooooood']
=> * 은 0회 이상 반복하는 경우
# o가 1회 이상 반복된 경우
s3 = 'gd god good goood goooood gooooooood'
re.findall('go+d', s3)
['god', 'good', 'goood', 'goooood', 'gooooooood']
=> + 은 1회 이상 반복하는 경우
# o가 1회 반복된 경우
s3 = 'gd god good goood goooood gooooooood'
re.findall('go{1}d', s3)
['god']
=> {1} 은 1회만 반복하는 경우
# o가 1회~4회 반복된 경우
s3 = 'gd god good goood goooood gooooooood'
re.findall('go{1,4}d', s3)
['god', 'good', 'goood']
=> {1,4} 은 1~4회 반복하는 경우
# o가 0 ~ 1회 반복된 경우
s3 = 'gd god good goood goooood gooooooood'
re.findall('go?d', s3)
['gd', 'god']
=> ? 은 0 ~ 1회 반복하는 경우
'Python 파이썬' 카테고리의 다른 글
파이썬 Excel 다루기 (0) | 2023.02.16 |
---|---|
파이썬 경로 확인, 텍스트 파일 읽고 쓰기 (0) | 2023.02.14 |
파이썬 함수 (0) | 2023.02.13 |
파이썬 제어문(3) - while 문 (0) | 2023.02.10 |
파이썬 제어문(2) - for 문 (0) | 2023.02.10 |