본문 바로가기

코딩?

정규표현식 예제풀기

https://programmers.co.kr/learn/courses/11/lessons/539

 

정규표현식 - 0개 이상

정규표현식으로 010, 123, 456 중 자연수를 찾으려면 어떻게 해야 할까요? 자연수는 0으로 시작하지 않으니 자연수의 첫자리는 반드시 1 ~ 9 중에 하나이어야 합니다. 그다음 자리부터는 0~9 사이의

programmers.co.kr

 

Part1. 전화번호 찾기

1. 문자열 속에서 전화번호를 찾아보세요

re.findall() : 문자열 속에서 정규식과 매칭되는 것들을 모두 찾아 리스트로 반환해주는 함수

 

#전화번호를 찾는 정규(표현)식 0\d{1,2}[ -]?\d{3,4}[ -]?\d{3,4}

0        : 숫자 0
\d{1,2}  : 숫자가 1개~2개
[ -]?    : 빈칸 또는 -가 0개~1개
\d{3,4}  : 숫자가 3개~4개
[ -]?    : 빈칸 또는 -가 0개~1개
\d{3,4}' : 숫자가 3개~4개

 

 

#정규표현식과 일치하는 부분을 모두 찾아주는 파이썬 코드입니다.

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

print("\n".join(result))

 

2. 숫자만 추출하고 싶을때는?

# \d : 숫자

# 빈칸에 정규표현식을 적습니다.
regex = '\d'

# 주소록입니다. 이후 강의에서 모두 이 search_target을 사용합니다.
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'''

# 정규표현식과 일치하는 부분을 모두 찾아주는 파이썬 코드입니다.
import re
result = re.findall(regex, search_target)
print(result)

 

3. 문자만 추출하고 싶을때는?

# \w : alphanumeric(문자+숫자)

# 빈칸에 정규표현식을 적습니다.
regex = '\w'

# 주소록입니다. 이후 강의에서 모두 이 search_target을 사용합니다.
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'''

# 정규표현식과 일치하는 부분을 모두 찾아주는 파이썬 코드입니다.
import re
result = re.findall(regex, search_target)
print(result)

 

4. 연결된 숫자를 찾고 싶을 때는?

# X+   : X가 무조건 출현, 한번 이상 출현
# \d+  : 숫자가 한 번 이상 출현

 

# 빈칸에 정규표현식을 적습니다.
regex = '\d+'

 

5. 자연수만 추출하고 싶을때는?

# *은 "0개 이상"이라는 뜻입니다. 따라서 \d*는 "숫자가 0개 이상이다"를 의미합니다. 
이를 이용하면 자연수는 [1-9]\d*로 표현할 수 있습니다.

 

[1-9]   : 문자열은 무조건 1-9 사이 숫자로 시작한다.
\d*     : 그 뒤에 숫자가 0번 이상 등장한다.

 

regex = '[1-9]\d*'

 

6. -가 들어있는 전화번호 추출(숫자 중간중간에 -가 두 번 나타남)

# X? : X가 0번 또는 1번 출현
# 전화번호는 "-"을 포함하거나, 포함하지 않을 수 있습니다.

 

regex = '\d+-?\d+-?\d+'

\d+  : 숫자가 무조건 출현. 1번 이상 출현 
-?   : -가 0번 또는 1번 출현
\d+  : 숫자가 무조건 출현. 1번 이상 출현 
-?   : -가 0번 또는 1번 출현
\d+  : 숫자가 무조건 출현. 1번 이상 출현

 

 

7. - 또는 공백이 포함된 전화번호 추출하기

# 앞에서 배운 \d+-?\d+-?\d+ 정규표현식은 
"010 2454 3457"과 같이 공백이 포함된 전화번호를 찾을 수 없지요.

# 모든 전화번호를 찾으려면
"-가 있거나 없다"는 조건이 아니라
"- 또는 공백이 있거나 없다"는 조건을 써야 합니다.

regex = '\d+[- ]?\d+[- ]?\d+'

\d+    : 숫자가 무조건 출현. 1번 이상 출현 
[- ]?  : - 또는 공백이 0번 또는 1번 출현
\d+    : 숫자가 무조건 출현. 1번 이상 출현 
[- ]?  : - 또는 공백이 0번 또는 1번 출현
\d+    : 숫자가 무조건 출현. 1번 이상 출현 

 

8. 숫자 갯수 지정해서 전화번호 추출

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

\d{2,3}  : 숫자가 2개 또는 3개
[ -]?    : 빈칸 또는 -가 0개~1개
\d{3,4}  : 숫자가 3개 또는 4개
[ -]?    : 빈칸 또는 -가 0개~1개
\d{3,4}  : 숫자가 3개 또는 4개

 

 

Part2. 문자열

9. 알파벳 중에 소문자 모음(a,e,i,o,u)만 고르고 싶을 땐

regex = '[aeiou]'

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'''

# 정규표현식과 일치하는 부분을 모두 찾아주는 파이썬 코드입니다.
import re
result = re.findall(regex, search_target)
result

 

10. 소문자 알파벳만 고르고 싶을 땐

[xㅡy]  : x부터 y까지 범위에 해당하는 것 전부 추출

regex = '[a-z]'

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'''

# 정규표현식과 일치하는 부분을 모두 찾아주는 파이썬 코드입니다.
import re
result = re.findall(regex, search_target)
print(result)

 

11. 연속된 영어 소문자를 찾으려면

regex = '[a-z]+'

 

12. 연속된 알파벳(영어 소문자, 대문자)를 찾으려면

regex = '[a-zA-Z]+'

 

13. 연속된 한글 단어를 찾으려면 어떻게 할까요?

regex = '[가-힣]+'

 

14. 이메일주소를 찾아봅시다.

regex = '[a-z_]+@[a-z]+.[a-z]+'

[a-z_]+  : 영어 소문자 a-z 또는 _가 한 번 이상 등장
@        : @ 등장
[a-z]+   : 영어 소문자 a-z가 한 번 이상 등장
.        : . 등장
[a-z]+   : 영어 소문자 a-z가 한 번 이상 등장

 

15. 문자열 이외의 특수문자를 찾아봅시다

\s : 공백 문자(스페이스, 탭, 뉴라인)
\S : 공백 문자를 제외한 문자
\d : 숫자
\D : 숫자를 제외한 모든 문자           
\w : alphanumeric(문자+숫자)
\W : non-alphanumeric(문자 및 "_" 제외한 특수문자, 공백 등)