본문 바로가기
정보/기술

re.sub 를 이용한 전화번호 마스킹 하기

by 라초딩 2025. 3. 25.

문제

연락처 목록에서 전화번호(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-12340*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**"로 변환된다.

댓글