When will you grow up?

Python을 이용한 정규표현식(regular expression) 본문

02. Study/Python

Python을 이용한 정규표현식(regular expression)

미카이 2019. 8. 12. 23:16

정규표현식은 'regex' 표현하기도 하며, 특정한 규칙을 가진 문자열을 집합을 표현하는 데 사용하는 형식 언어이다. 그래서 python 뿐만 아니라 모든 언어에서 정규표현식을 지원하며, 언어별로 큰 틀은 비슷하지만 조금씩 사용방법이 달라 이참에 간단하게 python을 이용하여 정리하였다.

 

나는 기본적으로 데이터 크롤링과정이나 json포맷을 뭔가 전처리를 하고 싶을 때 이용하는 편이고, 특히 문자열을 다룰 때 정말 유용한 거 같다.

 

meta string explain
[string1, string2, ...] [] 안에 있는 문자들이 존재하는 지 검색
.{m, n} m회 이상 n회 이하를 표현할때 사용
() ()는 grouping 이며 추출할 패턴을 지정
.

\n(Escape Character)를 제외한 모든 문자와 match

( .은 글자 하나를 의미)

* 0회 이상 반복 (없어도 괜찮다)
+ 1회 이상 반복 (무조건 한번 이상 등장해야 함)
| or 조건식을 의미
^ 문자열의 시작 의미
$ 문자열의 끝 의미

그 외에도, ? \ 등 다양한 메타 문자열이 많으니 필요시 위키를 확인 : 클릭

 

 

정규식 - python 에서는 re 모듈을 이용한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import re  # 정규표현식 모듈
= re.compile('[ab]')  # re내장모듈 compile 함수 이용
r.search('hamburger'# 문자열 전체에서 정규식에 부합하는 문자열이 있는지 검색 /  문자열 전체에서 찾음
# <_sre.SRE_Match object; span=(1, 2), match='a'>  # 존재시 처음 찾은 정보 출력(match object)
 
r.match('hamburger')  # 문자열의 처음이 정규식과 부합하는지 검색 / 문자열의 처음만 비교
# <None>
 
 
= re.compile("ck+w")  #  +   -->  바로 앞글자가 1개이상 인 것 
print(r.search("ckw")) # <_sre.SRE_Match object; span=(0, 3), match='ckw'>
print(r.search("ckkkkkw")) # <_sre.SRE_Match object; span=(0, 7), match='ckkkkkw'>
print(r.search("ckkk")) # None
print(r.search("cw")) # None
 
 
= re.compile("a.c")   #  .   -->   임의의 한문자   
                        #즉, a문자뒤 임의의 한문자, 그 뒤 c가 있는 것
print (  r.search("abc"))  # <_sre.SRE_Match object; span=(0, 3), match='abc'>
 
= re.compile("^c")    #  ^   --> 문장의 시작의미. c글자로 시작되는 문자열 
print (r.search("ckw")) # <_sre.SRE_Match object; span=(0, 1), match='c'>
print(r.search("sjc")) # None
 
= re.compile("e$")   #  $   -->  문장의 끝 의미.  e글자로 끝나는 문자열
print(r.search("apple")) # <_sre.SRE_Match object; span=(4, 5), match='e'>
print(r.search("banana")) # None
 

 

그렇다면 기본은 알았으니 조금만 응용해보자.

 

[0-9] -> 숫자 찾기

[^0-9] -> 숫자가 아닌 것을 찾는다

[\t\n\r\f\v] -> whitespace 문자인 것을 찾는다

[^\t\n\r\f\v] -> whitespace 문자가 아닌 것을 찾는다

[a-zA-Z0-9] -> 문자+숫자인 것을 찾는다. (특수문자 제외, _ 포함)

[^a-zA-Z0-9] -> 문자+숫자가 아닌 것을 찾는다.

외에도 응용하면 다양한 문자열 조작이 가능하다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import re
printre.search("\d+","치킨이 14000원입니다.") )  # 숫자를 1개 이상 포함하는 문자열
                                                  # <_sre.SRE_Match object; span=(4, 9), match='14000'>
 
 
result =  re.search("\d+","치킨이 14000원입니다."#Match 객체를 리턴 
print(start) # 4
end = result.end()
print (end)  # 9
print ( result.span() )  #(4, 9)
print ( result.group() ) # 14000 
 
 
aa = re.findall("\d+" , "미카이의 생일은 2222년 12월 12일 입니다.")   
print (aa) # ['2222', '12', '12']
for i in aa :
    print(i) # 2222, 12, 12
 
 
= re.compile("[a-zA-Z]+"
result = r.finditer("My birthday is 1999 01 11. "
for i in result :
    print (i.group()) 
    print(i.start()) 
    print(i.end()) 
    print(i.span())
 
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
 

 

 

 

간단한 이메일 체크하는것을 확인해보자.

1
2
3
4
5
6
= re.compile('^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+\.[a-zA-Z.]+$')
if z.search(email):
    print('올바르게 입력하였습니다.')
else:
    print('이메일 형식에 맞지 않습니다.')
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
 

 

 

 

 

전체 코드 : 클릭 

Comments