본문 바로가기
데이터&AI

정규표현식(regex, 레젝스) with 파이썬!! (2) - 메타문자와 반복

by 일등박사 2023. 1. 8.
728x90

지난 포스팅에 이어 정규표현식에 대하여 알아보겠습니다

2023.01.07 - [일등박사의 생각/데이터분석] - 정규표현식(regex, 레젝스) with 파이썬!! (1) - 기본

 

정규표현식(regex, 레젝스) with 파이썬!! (1) - 기본

import re 텍스트 작업을 하다보면 필요로하는 텍스트 유형만 산출해야하는 경우가 많습니다! 예를 들면 텍스트 내에서 ~~~@~~~.com 이라는 형식의 이메일 주소만 뽑기 혹은 010-XXXX-XXXX 형식의 전화번

drfirst.tistory.com

 


메타문자 활용하기 >>  \ 

앞 부분을 . 을 찾고싶을떄 역슬래시 "\" 를 활용해야 한다고 배웠습니다.

다음 예시를 보아요!

target_sentence = """
[일등박사]
[이등박사]
[삼등박사]
[사등박사]
(일등박사)
(이등박사)
(삼등박사)
(사등박사)
{일등박사}
{이등박사}
{삼등박사}
{사등박사}

"""
find_myName = re.compile("[일등..]")
re.findall(find_myName,target_sentence)

대괄호 안의 일등~~ 를 찾고 싶어서 진행해보았으나... 결과는 이상한 값들이 나왔는데요!!

['일', '등', '등', '등', '등', '일', '등', '등', '등', '등', '일', '등', '등', '등', '등']

그 이유는 대괄호를 나열로 인식해서 일이나 등이나 .이나.을 찾아라로 인식한것 입니다.

 

그렇기에 대괄호 앞에 \ 를 사용해주어 

"\[.등..\]" 이렇게!! 

target_sentence = """
[일등박사]
[이등박사]
[삼등박사]
[사등박사]
(일등박사)
(이등박사)
(삼등박사)
(사등박사)
{일등박사}
{이등박사}
{삼등박사}
{사등박사}

"""
find_myName = re.compile("\[.등..\]")
re.findall(find_myName,target_sentence)

그 결과 바라는 바만 확인되었습니다!!

 

['[일등박사]', '[이등박사]', '[삼등박사]', '[사등박사]']

메타문자 활용 >> 공백 찾기

메타문자에는 다양한 케이스가 존재하는데요!!

공백찾기 케이스에 대하여 알아보겠습니다!

메타문자
\n 줄바꿈
\t
[\b] 역스페이스
\f 페이지넘김
\v 수직탭
\r 캐리지 리턴
\s 모든 공백
\S 공백아닌 모든것

가장 이해하기 쉬운 줄바꿈 을 활용해봅시다!!

target_sentence = """
일등박사
이등박사
삼등박사
사등박사
일등박사~
이등박사~
삼등박사~
사등박사~

"""
find_myName = re.compile("..박사\n")
re.findall(find_myName,target_sentence)

 

그 결과 우리는 ~~ 박사이며 바로 줄바꿈이 된 아래의 결과를 볼 수 있었습니다

['일등박사\n', '이등박사\n', '삼등박사\n', '사등박사\n']

메타문자 활용 >> 숫자 찾기 / 영문 찾기

 

지난 포스팅에서 [0-9]를 통하여 모든 숫자를,

[a-z]를 통하여 문자를 찾을 수 있음을 배웠는데요!!

메타문자를 활용해도 가능합니다!! 

메타문자 의미
\d 숫자하나 [0-9]
\D 숫자를 제외한 문자하나 [^0-9]
\w 대소문자와 밑줄을 포함하는 영숫자 > 동일한것 [a-zA-Z0-9_]
\W 영어 숫자나 밑줄이 아닌 모든문자 > 동일한것 [^a-zA-Z0-9_]

숫자가 아닌 모든문자를 찾아보자!!

target_sentence = """
일등박사
이등박사
삼등박사
사등박사
1등박사
2등박사
3등박사
4등박사
"""
find_myName = re.compile("\D등박사")
re.findall(find_myName,target_sentence)

그 결과!!

['일등박사', '이등박사', '삼등박사', '사등박사']

 

이번엔! 

숫자 + 아무문자!! 를 찾아보자 "\d\w"

target_sentence = """
일등 1등 1s 일st 12
"""
find_myName = re.compile("\d\w")
re.findall(find_myName,target_sentence)
['1등', '1s', '12']

 

반복 찾기 >> "+" 활용하기

지금까지 배운내용을 바탕으로

이메일 주소를 찾으려면 어떻게해야할까?

\w@\w\.\w 를 한다면 ~@~.~ 가 된다!!

하지만,, 이것은 a@b.c 만 가능하지  aa@bb.cc 는 가능하지 않다 

target_sentence = """
myid@abc.com
a@b.c
"""
find_myName = re.compile("\w@\w\.\w")
re.findall(find_myName,target_sentence)
['a@b.c']

(\w는 하나의 문자이기 떄문에!)

그때 우리는 + 를 활용하게 된다

\w+@\w+\.\w+ 와 같이 된다면 아이디부에 문자들 (/w+) 그리고 도메인부에 도 마찬가지가 된다 

target_sentence = """
myid@abc.com
a@b.c
my.id@abc.com
"""
find_myName = re.compile("\w+@\w+\.\w+")
re.findall(find_myName,target_sentence)

이를 통해 여러 이메일주소를 찾을 수 있다.

['myid@abc.com', 'a@b.c', 'id@abc.com']

이에 더하여! 이메일에도 . 이 있는 경우도 (ex. my.id@abc.com)

완벽하게 잡아보쟈!!

 그래서 한번 더 최종적으로 이메일을 찾는 정규표현식을 만들었다!

target_sentence = """
myid@abc.com
a@b.c
my.id@abc.com
"""
find_myName = re.compile("[\w.]+@\w+\.\w+")
re.findall(find_myName,target_sentence)
['myid@abc.com', 'a@b.c', 'my.id@abc.com']

있어도되고 없어도 되고 >> "?" 활용하기

있어도 되지만 없어도되는경우!!

대표적인 예로 홈페이지 주소이다!

 

https://drfirst.tistory.com/
http://drfirst.tistory.com/

위 두개의 주소가 있다. 이떄 s가 있어도 되고 없어도되는것을 어떻게 표한할 수있을까???

 

바로 "?" 이다!! 

정규표현식 https?:/[\w./]+

을 본다면 s 뒤에 ? 가 있는데,

이로써 s가 있어도 되고 없어도 됨을 의미한다.

target_sentence = """
https://drfirst.tistory.com/
http://drfirst.tistory.com/
"""
find_myName = re.compile("https?:/[\w./]+")
re.findall(find_myName,target_sentence)

결과는 아래와 같다.

['https://drfirst.tistory.com/', 'http://drfirst.tistory.com/']

 

반복횟수 정하기 >> "{ } " 활용하기

날짜를 표현하는데는 다양한 유형이 존재합니다.

이러한 날짜 중 우리가 필요한 유형만 찾는 예시를 보아요!!

target_sentence = """
20220102
2022/01/02
2022-01-02
2022 01 02
02/01/2022
02-01-2022
02012022
"""
find_myName = re.compile("\d{4}-\d{2}-\d{2}")
re.findall(find_myName,target_sentence)

\d{4} 란 숫자(\d)가 4번 반복되는것을 찾으라는 뜻이었다. 

결과는 아래와 같다.

['2022-01-02']

전화번호를 찾을때 많이 활용된다

우리가 찾으려는 번호가 010으로 시작하며 가운데는 3,4자리이고 마지막이 4자리인 수라면??

"010-\d{3,4}-\d{4}"

를 통하여!!

target_sentence = """
010-0000-0000
017-0000-0000
010-000-0000
010-000-000
017-000-000
017-0000-0000
"""
find_myName = re.compile("010-\d{3,4}-\d{4}")
re.findall(find_myName,target_sentence)

잘 찾아졌다!!

['010-0000-0000', '010-000-0000']

참고!!

 

 

위 내용은 "손에 잡히는 정규표현식" 을 참고로 작성하였습니다!^^

https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=4342103 

 

손에 잡히는 정규표현식

손에 잡히는 정규표현식

www.aladin.co.kr

 

728x90

댓글