학습 목표 :
핵심 키워드 :
프로그래밍과 문제해결:
개념 용어 정리:
정규표현식은:
문법 정리: * 크게 4가지
1. Groups and ranges
Chracter 뜻
| : 또는
( ) : 그룹 (매치도 되고 그룹 1은 Hi 로 지정됨) 예) grey 중 gr(e|a)y(e 또는 a 문자열을 가진 y로 끝나는 단어를 찾고싶다.
[ ] : 문자셋, 괄호안의 어떤 문자든 예) gr[aed]y 하나라도 만족하는 것을 찾아라.
[^] : 부정 문자셋, 괄호안의 어떤 문가 아닐때 예) gr[^aed]y "aed"를 제외한 나머지를 찾아라.
(?:) : 찾지만 기억하지는 않음
2. Quantifiers
Chracter 뜻
? : 없거나 있거나 (zero or one) 예) gra?y : a가 있는거 또는 없는거 다 찾는다.
* : 없거나 있거나 많거나 (zero or more) : 예) gra*y : a 가 있거나 없가나 많거나.
+ : 하나 또는 많이 (one or more) : 예) gra+y : a가 하나 또는 많이
{n} : n번 반복 예) gra{2}y : a가 2번 나오는 단어 선택.
{min,} : 최소 예) gra{2,}y : a가 최소 2번 나오는 단어 선택.
{min,max} : 최소, 그리고 최대 예) gra{2,4}y : a가 최소 2번 최대 4번 나오는 것.
3. Boundary-type
Chracter 뜻
\b : 단어 경계 예) \bYa : 단어 앞에서 쓰이는 "Ya" 만 찾는다. 반대로 Ya\b.
\B : 단어 경계가 아님 예) Ya\B : Ya가 단어 뒤에서 쓰이지 않는 것만 찾는다.
^ : 문장의 시작 예) ^Ya : 문장에서 시작하는 Ya를 선택.
$ : 문장의 끝 예) $Ya : 문장에서 끝에 있는 Ya 를 선택.
4. Character classes
Chracter 뜻
** : 특수 문자가 아닌 문자
. : 어떤 글자 (줄바꿈 문자 제외)
\d : digit 숫자
\D : digit 숫자 아님
\w : word 문자
\W : word 문자 아님
\s : space 공백
\S** : space 공백 아님
Match 객체의 메서드 :
1) group( ) : 매치된 문자열을 리턴한다.
2) start( ) : 매치된 문자열의 시작 위치를 리턴한다.
3) end( ) : 매치된 문자열의 끝 위치를 리턴한다.
4) span( ) : 매치된 무낮열의 (시작, 끝) 에 해당하는 튜플을 리턴한다.
import re
p = re.compile('[a-z]+')
m = re.match('python')
print(m.group()) # python 매치된 문자열
print(m.start()) # 0 첫 시작 인덱스
print(m.end()) # 6 끝 인덱스
print(m.span()) # (0.6) 시작과 끝 인덱스를 튜플 형식으로 반환
* import re(regular expression)
p = re.compile('[a-z]+') a~z 까지 문자가 한 번 이상 반복되는걸 찾아라.
*** p: 패턴객체
정규식을 이용한 문자열 검색:
Method: 목적
match(): 문자열의 처음부터 정규식과 매치되는지 조사한다.
search(): 문자열 전체를 검색하여 정규식과 매치되는지 조사한다.
findall(): 정규식과 매치되는 모든 문자열(substring)을 리스트로 돌려준다.
finditer(): 정규식과 매치되는 모든 문자열(substring)을 반복 가능한 객체로 돌려준다.
import re
p = re.compile('[a-z]+') # a~z 까지 한 번 이상 반복되는 것을 찾기.
m = p.match('3 python') # 3 는 a~z 에 없음. 매치 안될 경우 "None"이 나옴.
m = p.search('3 python') # 첫번째가 꼭 일치하지 않아도, 일치하는 구문이 있으면 일치하는 것을 찾아줌.
m = p.findall('life is too short') # 일치하는 것을 찾아서 리스트로 return
m = p.finditer('life is too short') # 일치하는 것을 찾아서 iterator object 로 return. 매치 되는 문자열을 다 match 객체 형태로 반복가능한 형태로 반환.
print(m)
컴파일 옵션: 컴파일 할 때 옵션을 주는 방법.
1) DOTALL, S:
import re
p = re.compile('a.b') # . 이 들어가면 줄바꿈으 제외한 모든 문자 매치.
m = p.match('a\nb')
print(m)
import re
p = re.compile('a.b', re.DOTALL) # 실행했을 때 줄바꿈 문자가 있어도 객채가 매칭되서 나옴. 즉 줄바꿈 문자도 포함하라는 명령어.
m = p.match('a\nb')
print(m)
2) IGNORECASE, I:
import re
p = re.compile('[a-z]')
print(p.match('python')) # 소문자로 매칭이 됨
print(p.match('Python')) # 매칭 안 됨
print(p.match('PYTHON')) # 매칭 안 됨
import re
p = re.compile('[a-z]', re.I) # 대소문자 다 매칭해준다.
print(p.match('python')) # 소문자로 매칭이 됨
print(p.match('Python')) # 매칭 됨
print(p.match('PYTHON')) # 매칭 됨
3) MULTILINE, M:
import re
p = re.compile("^python\s\w+") # 꺽새는 맨 처음에 파이썬이 나오는 단어 찾아라. 그 뒤에 공백 그리고 단어가 반복되는 문자를 찾아라.
data = """python one
life is too short
python two
you need python
python three"""
print(p.findall(data)) # python one 만 반환.
import re
p = re.compile("^python\s\w+, re.M") # 이러면 3개 다 반환. 다 새로운 줄의 맨 처음으로 인식해서 결국 다 반환하는 것.
data = """python one
life is too short
python two
you need python
python three"""
print(p.findall(data)) # python one, two, three 다 반환.
4) VERBOSE, X :
import re
charref = re.compile(r'&[#](0[0-7]+|[0-9]+|x[0-9a-fA-F]+);') # 이렇게 긴 정규표현식이 있을 때 나눠서 볼 수 있게 만드는 옵션. 알아보기 쉽게 띄어쓰기로 나눌 수 있음.
charref = re.compile(r"""
&[#]
(
0[0-7]
|[0-9]
|x[0-9a-fA-F]+
)
;
""", re.VERBOSE)
느낀점) 정규표현식에 대해서 알아보았다. 물론 깊게 들어가면 더 많은 부분을 배워야겠지만 지금 당장은 이 정도도 충분한 것 같다. 열공하자!