본문 바로가기

Python 파이썬

파이썬 정규표현식

정규표현식

  • 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