먼저 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
다음과 같이 잘 치환된 것을 확인할 수 있다.
'DAFIT > 905 - 정규표현식' 카테고리의 다른 글
<DAFIT> 05 Regular Expression 02 - 날짜 (0) | 2019.11.18 |
---|