정규표현식

이제 파이썬 코드는 제일 위 한 번만 적겠다..!
나에겐 의미가 없기에...

4. 하나 이상

\d는 숫자를 한 글자만 찾는다.
+는 '하나 혹은 그 이상 연결된' 이란 뜻이다.
즉, \d+는 '하나 혹은 그 이상 연결된 숫자`이다.

# 정규표현식
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'''

# 파이썬 코드
import re
result=re.findall(regex,search_target)
print(result)

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

붙어 있는 숫자끼리 출력되는 것을 확인할 수 있다...!!


5. 0개 이상

*은 '0개 이상'이란 뜻이다.
\d*은 '숫자가 0개 이상'이란 뜻이다.
[1-9]\d*을 하면 '1~9 사이의 숫자 0개 이상'을 뜻한다!

# 정규표현식
regex = r'[1-9]\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'''

# 출력
2
123
4567
70
9999
9999
10
2454
3457

6. 있거나 없거나? [1]

전화번호는 =를 포함하거나, 포함하지 않을 수 있다.
021234567 이나 02-123-4567 처럼.
연속된 3~4개 숫자 사이에 -가 있거나 없거나.
?는 '있거나 없거나' 란 뜻이다.
-?는 '-가 있거나 없다.' 란 뜻이 된다.

# 정규표현식
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'''

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

하지만 위 표현식은 010 1234 5678같은 번호는 찾을 수 없다...


7. 있거나 없거나? [2]

'-가 있거나 없다.'의 조건이 아니라,
'-또는 공백이 있거나 없다.'를 사용해야 한다...!

# 정규표현식
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'''

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

여기까지하니 슬슬 감이 온다...ㅎㅎㅎ


8. 이전 정규표현식의 문제

앞서 사용한 정규표현식은 숫자가 많이 연결되어있어도 전화번호로 인식한다...

# 정규표현식
regex = r'\d+[- ]?\d+[- ]?\d+'

# 주소록
search_target = '''이상한 전화번호 0030589-5-95826
Luke Skywarker 02-123-4567 luke@daum.net
다스베이더 070-9999-9999 darth_vader@gmail.com
princess leia 010 2454 3457 leia@gmail.com'''
# 출력
['0030589-5-95826', '02-123-4567', '070-9999-9999', '010 2454 3457']

9. n번

{숫자} 는 '숫자번 반복한다.' 는 뜻이다.
\d{2}는 '숫자가 연속 두 번 나온다.'는 뜻이 된다.

# 정규표현식
regex = '\d{2}[ -]?\d{3}[ -4]?\d{4}'

# 주소록
search_target = '''이상한 전화번호 0030589-5-95826
Luke Skywarker 02-123-4567 luke@daum.net
다스베이더 070-9999-9999 darth_vader@gmail.com
princess leia 010 2454 3457 leia@gmail.com'''

# 출력
['02-123-4567']

출력만 봐도 알다시피 010 ~은 인식 못한다...


10. n~m번

{숫자1, 숫자2}는 '숫자1 ~ 숫자2까지 반복한다.'는 뜻이다.
\w{2,3}는 '문자가 2~3번 나온다.'는 뜻이다.

# 정규표현식
regex = '\d{2,3}[ -]?\d{3,4}[ -]?\d{4}'

# 주소록
search_target = '''이상한 전화번호 0030589-5-95826
Luke Skywarker 02-123-4567 luke@daum.net
다스베이더 070-9999-9999 darth_vader@gmail.com
princess leia 010 2454 3457 leia@gmail.com'''

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