정규표현식 - 전화번호 찾기

이태연·2021년 11월 20일
0

파이썬은 정규표현식을 지원하기 위해 re(regular expression)모듈을 제공합니다.
re모듈은 파이썬이 설치될 때 자동으로 설치되는 기본 라이브러리이므로 따로 설치할 필요는 없습니다.

import re

regex = r"정규식 문법" 
search_target = "대상 문장"

result=re.findall(regex, search_target) 

대상문장
Luke Skywarker 02-123-4567 luke@daum.net 다스베이더 070-9999-9999 darth_vader@gmail.com princess leia 010 4321 8765 leia@gmail.com

-정규표현식

\w 글자를 대표하는 정규표현식(a,b,c,가,나,다,1,2와 같은 문자와 숫자를 포함. 특수문자는 포함하지 않지만 언더스코어_는 포함)

\d 숫자를 의미하는 정규표현식

+ "하나 혹은 그 이상 연결된" 을 의미하는 정규표현식

=>\d는 숫자를 의미하고 +는 "하나 혹은 그 이상 연결된"을 의미하기 때문에 "하나 혹은 그 이상 연결 된 숫자"를 의미하는 정규표현식은 \d+입니다.

import re

regex = r"\d+"
search_target = "Luke Skywarker 02-123-4567 luke@daum.net 다스베이더 070-9999-9999 darth_vader@gmail.com princess leia 010 2454 3457 leia@gmail.com"

result=re.findall(regex, search_target)
print(result)

#출력물
['02', '123', '4567', '070', '9999', '9999', '010', '2454', '3457']

* "0개 이상"을 의미하는 정규표현식

정규표현식으로 자연수를 찾으려면 자연수의 조건에 대해 먼저 생각해 봐야됩니다.
1.자연수의 첫자리는 0이 아닌 1-9중에 하나여야합니다.
2.그다음 자리부터는 0-9사이의 숫자가 나올 수도, 나오지 않을 수도 있습니다.

*는 "0개 이상"을 뜻하기 때문에 이를 이용하면 자연수는 [1-9]*로 표현할 수 있습니다.

? "있거나 없거나"를 의미하는 정규표현식

전화번호는 02-123-5678, 010 1234 5678 같은 모양입니다. 즉 전화번호는 -를 포함할 수도, 포함하지 않을 수도 공백을 포함할 수도, 포함하지 않을 수도 있습니다.

=>-또는 (공백)이 있거나 없다는 조건은 [- ]?로 표현할 수 있습니다

import re

regex = r"\d+[- ]?\d+[- ]?\d+"
search_target = "Luke Skywarker 02-123-4567 luke@daum.net 다스베이더 070-9999-9999 darth_vader@gmail.com princess leia 010 2454 3457 leia@gmail.com"

result=re.findall(regex, search_target)
print(result)

#출력물
['02-123-4567', '070-9999-9999', '010 2454 3457']

하지만 위와 같은 정규표현식으로도 전화번호를 찾는데는 한계가 있습니다. 만약 "0012323-4-442323"와 같이 연결된 숫자가 많은 경우에도 찾아지기 때문입니다.

이를 해결하기 위한 정규표현식이 바로 {숫자} 입니다. {숫자}는 중괄호 안에 들어간 숫자만큼 반복한다는 뜻입니다.

그리고 {숫자1, 숫자2} 는 "숫자1부터 숫자2까지 반복한다" 라는 의미를 가집니다. 이를 활용하면 다음과 같이 표현할 수 있습니다.

\d{2,3}[- ]?\d{3,4}[- ]?\d{4}

=>처음 2~3자리 / 가운데 3~4자리 / 마지막4자리를 가진 숫자를 찾는 정규표현식이기 때문에 전화번호 표현이 가능합니다.

import re

regex = r'\d{2,3}[- ]?\d{3,4}[- ]?\d{4}'
search_target = "Luke Skywarker 02-123-4567 luke@daum.net 다스베이더 070-9999-9999 darth_vader@gmail.com princess leia 010 2454 3457 leia@gmail.com"

result=re.findall(regex, search_target)
print(result)

#출력물
['02-123-4567', '070-9999-9999', '010 2454 3457']

참고: 프로그래머스 정규표현식, https://programmers.co.kr/learn/courses/11

profile
주니어 백엔드 웹 개발자입니다.

0개의 댓글