본문 바로가기
Python

Python - Regex 개인정보(주민등록번호,전화번호,휴대폰번호,이메일) 패턴

by 올엠 2024. 3. 11.
반응형

Python의 정규식 표현을 이용해서 개인정보를 탐지할 수 있는데, 다양한 정보를 비교해본 결과 필자 기준으로 적용한 내용들을 정리해본다.

각 탐지 기준은 한국에 맞도록 구성되어 있음을 미리 밝힌다. 그리고 각 탐지 조건은 아래 사이트에서 테스트가 가능하다.

https://regex101.com 

 

regex101: build, test, and debug regex

Regular expression tester with syntax highlighting, explanation, cheat sheet for PHP/PCRE, Python, GO, JavaScript, Java, C#/.NET, Rust.

regex101.com

 

1. 주민등록번호

주민등록 번호를 탐지하기 위해서는 2가지 정도의 패턴을 고민했다.

하나는 주민등록번호의 자리마다 들어갈 수 있는 숫자를 탐지하는 것이다. 이는 이미 많은 Regex가 공유되어 있어서 쉽게 구현이 가능하였는데,

두번째는 6자리와 7자리로 올 때 공백 구분이다. 그리고 숫자가 13자리 이상올 때 간혹 주민등록 패턴과 일치하는 경우가 있다. 이를 최소화 하기 위해서 시작하는 숫자가 주민등록유형이 아닌경우는 예외하고 탐지하도록 구성하였다.

  • 주민등록번호가 일치하는 문장, 주민등록번호가 일치하는 경우에만 탐지
  • 예)790212-3244134 혹은 7902123244134, 790212 3244134. 탐지
^([0-9]{2}(?:0[1-9]|1[0-2])(?:0[1-9]|[1,2][0-9]|3[0,1]))[-, ]{0,1}[1-4][0-9]{6}
  • 주민등록 번호가 포함된 문장으로 시작점이 일치해야 하는 문장으로 11830212-3244134 같은 경우는 예외된다.
  • 예)안녕790212-3244134 혹은 안녕하세요 7902123244134입니다., 다시790212 3244134입니다. 탐지
(?<!\d)([0-9]{2}(?:0[1-9]|1[0-2])(?:0[1-9]|[1,2][0-9]|3[0,1]))[-, ]{0,1}[1-4][0-9]{6}

위 2가지 패턴중 두번째 패턴이 사용하기에 유용하다.

2. 전화번호/핸드폰 번호

전화번호는 비교적 쉽게 Regex를 만들수 있지만 그만큼 오탐이 많은편이다. 문장에 지역번호와 핸드폰 번호 시작 10을 탐지하는 방식

  • 핸드폰 번호, 국제 연결시 앞 0을 제거하는 경우를 위해 10로 시작하는 패턴이다. 앞에 숫자가 붙는것을 방지하는 것이 최선
  • 예) 10-444-4444, 10-41433443 탐지, 110-3933-4444으로 시작하는 것은 예외
(?<!\d)(10)[ ,-]-?\d{3,4}[ ,-]-?\d{4}
  • 핸드폰 번호로 앞서 숫자를 무시하도록 하였기 때문에, 010으로 시작하는것을 탐지하고자 한다면 위에 0하나를 붙여서 사용하기를 권장한다.
(?<!\d)(010)[ ,-]-?\d{3,4}[ ,-]-?\d{4}
  • 전화번호는 지역번호 2부터6까지를 한자리혹은 두자리로 탐지하는 방식이다. 동일하게 숫자로 시작하는 경우를 배제하면 오탐비율이 줄어든다.
(?<!\d)(0)[2-6]{1,2}[-,]?\d{3,4}[-,]?\d{4}

3. 이메일

  • 이메일의 경우@와 .이 들어갔는지를 탐지하는 조건이고 문자열이 들어가는 조건이라 어렵지 않게 구현이 가능하다.
  • 2차 도메인의 경우 과도하게 길지 않지 않기 때문에 2에서 7자리로 제한을 하면 오탐이 많이 줄어든다
[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,7}

 

반응형