파이썬은 정규표현식을 지원하기 위해 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