앎을 경계하기

DAFIT/905 - 정규표현식

<DAFIT> 05 Regular Expression 01 - 전화번호

양갱맨 2019. 11. 18. 00:39

먼저 regular expression을 사용하기 위해서 python 라이브러리인 re를 사용한다.

import re

시내 전화, 서울, 기타 지역 전화를 필터링 하기 위해 메타 문자(특별한 용도로 사용하기 위한 문자)를 사용하여 정규표현식을 만들어보자.

시내전화의 경우,

3~9로 시작하는 8자리 전화번호 이거나 XXX-XXXX으로 된 7자리 전화번호이다.

먼저 3~9로 시작해도되고 아니어도 되기때문에

첫문자가 3~9여도되고 아니어도 되고를 표현하는 것은 ^[3-9]?이다.

^는 []밖에 있을 때 처음이라는 의미이다.

[]안에 -로 묶인 값은 범주를 나타낸다.
ex) [a-z] = a~z, [0-9] = 0~9

?는 있어도 되고 없어도 된다를 나타내는 메타문자이다.

그 뒤 XXX-XXXX은 반드시 앞 번호는 0-9의 숫자로 세자리가 들어가며 뒤는 0-9의 숫자로 네자리가 들어간다.

숫자 반복을 나타내기 위해 {반복 수}를 사용하면 숫자 개수를 체크할 수 있다.
ex) {1,3} = 1~3회 반복된 문자 체크, {3} = 3회 반복된 문자 체크

따라서 XXX -> [0-9]{3}, XXXX -> [0-9]{4} 로 나타낼 수 있다.

여기서 중요한 점은

시내번호와 기타 지역 번호의 경우 체크가 겹치는 경우가 발생한다.

예를 들어 "030-3333-3333"이라는 번호는 030-3333이라는 부분이 시내번호의 정규표현식에 매치되어서 결과적으로 '030-3333'이라는 시내번호 매치 결과가 생기게 된다.

전화번호가 XXXX 로 끝나는 것을 검사하기 위해서 (?![0-9]|-) 조건을 사용한 표현식으로 만들어준다.

표현식 1(?! 표현식2)는 표현식1 뒤 문자가 표현식2와 *_매치되지 않으면 *_표현식1과 매치한다는 조건 정규표현식이다.

예시에 적용해보면

표현식 1 = ^[3-9]?[0-9]{3}-[0-9]{4}

기존에는 030-3333까지는 표현식 1에 매치된다.

그러나 (?![0-9]|-)을 붙여줌으로써 030-3333 뒤에 숫자나 - 문자가 없어야 표현식 1과 매치된다라고 판단하는 것이다.

서울의 경우,

반드시 02로 시작하고

3-9로 시작하는 숫자가 한자리 있거나 없어도되고

XXX-XXXX로 이루어진 번호이다.

(N)XXX-XXXX가 시내전화와 중복되기때문에

지역번호 02-를 ^[3-9]?[0-9]{3}-[0-9]{4}앞에 추가하여 표현할 수 있다.

서울 번호도 뒤에 다른 번호가 붙지않도록 (?![0-9]|-)를 추가해준다.

기타 지역의 경우,

지역번호가 0, 3-9사이 숫자, 0-9사이 숫자로 이루어져 있다.

지역번호 뒤에 오는 번호는 시내전화, 서울의 경우와 같은 (N)XXX-XXXX이다.

지역번호를 설정해서 시내전화의 정규표현식과 합쳐주면된다.

0[3-9][0-9]- : '0NX-'를 검사.

[3-9]?[0-9]{3}-[0-9]{4}(?![0-9]|-) : 시내번호 정규표현식과 같음.

downtown = re.compile('^[3-9]?[0-9]{3}-[0-9]{4}(?![0-9]|-)')
seoul = re.compile('02-[3-9]?[0-9]{3}-[0-9]{4}(?![0-9]|-)')
etc = re.compile('0[3-9][0-9]-[3-9]?[0-9]{3}-[0-9]{4}(?![0-9]|-)')

정규표현식패턴을 다음과 같이 re.compile()을 사용해 객체로 만든 후에 match()를 사용해 테스트케이스 배열을 돌면서 각 전화번호를 체크한다.

testcase = ["4411-8848","210-7979","02-210-2929","02 290-2100",
            "031-210-2929","031-2210-2929","021-310-2929","210-999","2109-999","030-3333-3333"]

for idx in range(len(testcase)):
    rd = downtown.match(testcase[idx])     #시내번호 체크
    rs = seoul.match(testcase[idx])        #서울번호 체크
    re = etc.match(testcase[idx])        #기타번호 체크
    #정규표현식에 맞지 않으면 None return하기때문에 if문으로 체크가능 (if None == if False)
    if rd:
        testcase[idx] = "REPLACEPHONE"
    if rs:
        testcase[idx] = "REPLACEPHONE"
    if re:
        testcase[idx] = "REPLACEPHONE"

변경된 테스트케이스를 출력해보면

testcase

다음과 같이 잘 치환된 것을 확인할 수 있다.

 

 

http://www.dafit.me/question/?q=YToxOntzOjEyOiJrZXl3b3JkX3R5cGUiO3M6MzoiYWxsIjt9&bmode=view&idx=2643277&t=board

 

[DF905] Regular Expression (정규 표현식) : 다핏, 데이터사이언스 연습문제

🔥 문제 설명실무에서 필수적으로 쓰이는 정규표현식의 기초를 두 가지 사례로 익힌다.자연어 처리 관련 직군의 코딩 테스트에서도 정규표현식 문제는 자주 등장한다. 🔥 추천 대상자연어 처리를 공부하고자 하는 사람.자연어 처리를 공부하고 있지만 전처리 연습이 부족한 사람.정규표현식만 나오면 자신이 없는 사람.파이썬을 이용한 정규표현식 연습을 하고 싶은 사람.🔥 학습 목표정규 표현식으로 데이터의 다양한 규칙을 표현할 수 있다.데이터를 정규 표현식을 이용해서 전처리

www.dafit.me

 

'DAFIT > 905 - 정규표현식' 카테고리의 다른 글

<DAFIT> 05 Regular Expression 02 - 날짜  (0) 2019.11.18