문제
연락처 목록에서 전화번호(010-7890-1234
)를 특정 패턴(0*0-7*9*-12**
)으로 마스킹하는 작업을 수행하고자 한다. 이때 어떻게 해야 하는가? 여기서 활용할 함수는 re.sub함수를 사용하면 된다.
1. re.sub
함수
re.sub
는 문자열에서 정규 표현식을 사용하여 특정 패턴을 찾아 다른 문자열로 대체하는 함수다.
re.sub(pattern, repl, string)
pattern
: 찾고자 하는 정규식을 나타낸다.repl
: 대체하고 싶은 문자열을 입력한다. 여기서 그룹을 지정할 때\1
,\2
등으로 매칭된 값을 사용 가능하다.string
: 처리해야할 대상을 입력하면 된다.
2. 전화번호 수정 사용자 함수 작성: refine_mask_phone_numbers
def refine_mask_phone_numbers(contact):
return re.sub(r'(\d)(\d)(\d)-(\d)(\d)(\d)(\d)-(\d)(\d)(\d)(\d)', r'\1*\3-\4*\6*-\8\9**', contact)
pattern(찾고자 하는 정규식, 패턴): '(\d)(\d)(\d)-(\d)(\d)(\d)(\d)-(\d)(\d)(\d)(\d)'
전화번호의 각 자리수를 개별 그룹으로 캡처한다. 이렇게 개별 숫자로 분리하면, 원하는 자리만 남기고 나머지를 *로 치환하는 작업이 훨씬 용이해질 수 있다.
repl(대체 문자열): r'\1*\3-\4*\6*-\8\9**'
해당하는 각 위치의 숫자를 *로 치환하게 된다. 결과적으로, 전화번호 010-7890-1234
는 0*0-7*9*-12**
로 변환된다.
정규표현식 대체 문자열 r'\1*\3-\4*\6*-\8\9**'
는 정규표현식 패턴에 의해 캡처된 각 그룹을 바탕으로 전화번호의 일부 자리는 그대로, 일부 자리는 *
로 마스킹하는 역할을 한다. 패턴이 다음과 같이 각 숫자를 개별 그룹으로 캡처했다고 가정할 때,
r'(\d)(\d)(\d)-(\d)(\d)(\d)(\d)-(\d)(\d)(\d)(\d)'
각 그룹은 아래와 같이 대응된다.
- 첫 번째 부분 ("010")
- \1: 첫 번째 숫자 → '0'
- \2: 두 번째 숫자 → '1' (하지만 대체 문자열에서는 사용하지 않음, 대신
*
로 대체) - \3: 세 번째 숫자 → '0'
\1*\3
→ "0*0" - 두 번째 부분 ("7890")
- \4: 첫 번째 숫자 → '7'
- \5: 두 번째 숫자 → '8' (사용하지 않고
*
로 대체) - \6: 세 번째 숫자 → '9'
- \7: 네 번째 숫자 → '0' (사용하지 않고
*
로 대체)
\4*\6*
→ "79" - 세 번째 부분 ("1234")
- \8: 첫 번째 숫자 → '1'
- \9: 두 번째 숫자 → '2'
- \10: 세 번째 숫자 → '3' (대체 문자열에서 사용하지 않음)
- \11: 네 번째 숫자 → '4' (대체 문자열에서 사용하지 않음)
\8\9**
→ "12**"
여기서 마지막 두 개의 *
는 세 번째 부분의 뒤쪽 두 자리를 마스킹하기 위해 직접 추가한 리터럴 문자다. 또한 각 부분 사이의 -
기호는 전화번호 형식의 구분자로 그대로 남긴다.
정리하면,
- 첫 번째 그룹: \1*\3 → 첫 번째와 세 번째 숫자만 남기고 두 번째는
*
처리 - 두 번째 그룹: \4\6 → 첫 번째와 세 번째 숫자만 남기고 두 번째와 네 번째는
*
처리 - 세 번째 그룹: \8\9 뒤에 ** 리터럴 추가 → 처음 두 숫자만 남기고 나머지 두 자리는
*
처리
이렇게 해서 최종적으로 "010-7890-1234"
는 "0*0-7*9*-12**"
로 변환된다.
'정보 > 기술' 카테고리의 다른 글
구글포토에서 다운받은 사진 찍은 날짜(찍은 순서)로 정렬하기(Windows) (0) | 2025.03.15 |
---|---|
티스토리 폰트 변경하기; google font 적용 (1) | 2025.03.06 |
[잡담] R 입문서 집필 하기 (2) | 2025.03.01 |
Homebrew 업데이트 방법 (0) | 2025.02.27 |
Homebrew를 사용하는 이유 (0) | 2025.02.26 |
댓글