반응형
Python의 정규식 표현을 이용해서 개인정보를 탐지할 수 있는데, 다양한 정보를 비교해본 결과 필자 기준으로 적용한 내용들을 정리해본다.
각 탐지 기준은 한국에 맞도록 구성되어 있음을 미리 밝힌다. 그리고 각 탐지 조건은 아래 사이트에서 테스트가 가능하다.
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}
반응형
'Python' 카테고리의 다른 글
Python/Django - 리스트 마지막 콤마?! (0) | 2024.03.14 |
---|---|
Django - django-admin을 찾지 못할때 (0) | 2024.03.14 |
Django - django-admin을 찾지 못할때 (0) | 2024.03.10 |
Python - Timezone 포맷 Datetime 값 비교 오류 (0) | 2024.03.10 |
Python - Datetime 특정 시간 간격으로 나누기 (0) | 2024.03.10 |