IT/프로그래밍

[파이썬] re 모듈 사용방법 [패스트 캠퍼스 챌린지 45일]

뜻밖의 행복 2022. 3. 9. 22:01
반응형

안녕하세요? 뜻밖의 행운입니다.

오늘은 3월 9일 대통령 선거 투표 날이었습니다.

하지만 패스트 캠퍼스 도전은 멈추지 않습니다.

45일차 이제 5일 남았네요 ㅎ

출구 조사를 보니 워낙 박빙이라 정말 끝까지 가봐야 알 수 있겠습니다.

오늘은 파이썬 re 모듈 2번째 시간이었네요 

예제를 보니 어떻게 활용할지 대충 감이 왔습니다.

오늘 배운 내용을 되돌려 보면 아래와 같습니다.

import re

# 1. Group 그룹

# 1) 매칭되는 문자열 한개
str1 = '010-1234-5678'
result = re.match('\d{2,3}-\d{3,4}-(\d{4})$', str1)
print(result.group(1))

# 2) 매칭되는 문자열 여러개
str2 = '010-1234-5678,010-2222-3333,010-4444-5555,010-6666-7777,010-8888-9999'
results = re.finditer('\d{2,3}-\d{3,4}-(\d{4})(?=,|$)', str2)

for idx, result in enumerate(results, 1):
    print(f'{idx}. {result.group(1)}')

# 2. Substitution (교체)
str3 = '010-1234-5678'
result = re.sub('(?<=\d{3}-\d{4}-)\d{4}', '****', str3)
print(result)

또 하나하나 살펴봐야겠죠?

우선 첫번 째 매칭되는 문자열 한개

str1 = '010-1234-5678'
result = re.match('\d{2,3}-\d{3,4}-(\d{4})$', str1)
print(result.group(1))

str1 변수에 전화번호를 담습니다. 

그리고 마지막 자리를 () 괄호로 감싸서 그룹으로 지정해줍니다.

정규표현식을 너무 사용하면 가독성이 떨어진다는 말이 무슨뜻인지 이제는 바로 알겠습니다.

result 쪽을 좀 살펴 보겠습니다.

'\d{2,3}-\d{3,4}-(\d{4})$' 

이것을 해석하는게 사실 핵심입니다. 

고대문자나 외계어도 아니고 ㅎㅎ

 

우선 \d는 정규표현식에서 숫자를 의미합니다. 

그리고 2,3 이라는 것은 {숫자, 숫자}의 경우 지난시간에 몇개의 문자로 되어 있는지를 

나타낸다고 했습니다. 

즉 숫자로 된 2~3개 문자 - 숫자로 된 3~4개 문자 - (4자리로 된 숫자문자) 를 뜻하는 것입니다.

전화 번호 마지막 4자리만 그룹화 한다는 것이고 

그 결과를 print로 출력하는 것이지요 정말인지 한번 볼까요?

 

네 실행시켜 보니 세상에 이럴수가! 진짜로 뒤에 4자리 5678만 출력이 됩니다.

뿌듯하네요 ㅎ

 

import re

# 2) 매칭되는 문자열 여러개
str2 = '010-1234-5678,010-2222-3333,010-4444-5555,010-6666-7777,010-8888-9999'
results = re.finditer('\d{2,3}-\d{3,4}-(\d{4})(?=,|$)', str2)

for idx, result in enumerate(results, 1):
    print(f'{idx}. {result.group(1)}')

이번에는 처음과 다르네요 str2에 담기는 변수가 전화번호가 1개가 아닙니다. 

여러개 입니다. 여기서 어떻게 각각 전화번호에서 맨뒤 4자리 숫자만 추출할까요?

우선 반복되는 패턴을 찾아야겠죠 전화 번호 사이는 , 으로 구분이 됩니다. 

그리고 맨마지막은 , 없이 그냥 끝납니다. 이 사실을 바탕으로 작성하면 됩니다.

'\d{2,3}-\d{3,4}-(\d{4})(?=,|$)'

복잡할줄 알았는데 간결합니다. 처음에서 (?=,|$) 만 추가 하면 됩니다.

위 내용은 전방탐색으로 지난시간에 배웠습니다.

,|$은 탐색용으로만 쓰고 결과에는 포함시키지 않겠다는 내용이죠 

$는 맨끝을 의미합니다.

 

그럼 잘되는지 볼까요?

 

네 굳굳! 잘되는게 보입니다.

 

import re

str3 = '010-1234-5678'
result = re.sub('(?<=\d{3}-\d{4}-)\d{4}', '****', str3)
print(result)

마지막으로 교체 입니다. 

전화번호는 개인정보 일 수 있으므로 

맨뒤 4자리를 ****형식으로 마스킹을 하고 싶습니다. 

어떻게 하면 될까요? sub 매서드를 사용하면 됩니다.

그리고 후방탐색을 통해 교체해주면 됩니다.

후방탐색의 경우 숫자 범위 지정이 안되고 반드시 숫자를 고정시켜야 됩니다. 

그래서 형식이 좀 다르고 후방 탐색의 경우 = 이 아니라 <= 형식으로 사용해야 합니다.

그래서 전화번호에는

?<=\d{3}-\d{4}-)\d{4}'

식으로 써야 하죠 

 

잘 되나 볼까요?

 

오 동작이 잘되네요 

그나저나 출구 조사를 보니 정말 박빙이네요 

이렇게 반반 갈리다니 아무튼 

결과가 어떻게 되서 나오든 투표 후에는 다시 국민이 하나 되어 

좋은 대한민국이 되었으면 좋겠습니다.

지지 후보가 다르다고 원수같이 생각할 필요 없이 소중한 국민이니까요

 

 

반응형