정규 표현식 ('정규식')
정규식이 필요한 이유 : 훨씬 간편하고 직관적인 코드 작성 가능
정규식 참고 링크
1. 정규 표현식의 기초, 메타 문자
메타 문자란, 원래 그 문자가 가진 뜻이 아닌 특별한 용도로 사용하는 문자
. ^ $ * + ? { } [ ] \ | ( )
1) 문자 클래스 []
- 이 정규식은 "[] 사이의 문자들과 매치" 란 의미를 지님
- 메타 문자인 [] 사이에는 어떤 문자도 들어감
- [] 안의 두 문자 사이에 하이픈(-) 을 사용시 두 문자 사이의 범위(From-To) 를 의미
- [] 안에 ^ 는 반대의 의미
[a-c] 는 [abc] 의미
[0-5] 는 [012345] 의미
[a-zA-z] 는 알파벳 모두
[0-9], \d : 숫자
\s : 문자
[^0-9], \D : 숫자가 아닌 문자
[a-zA-Z0-9_], \w : 문자+숫자
[^a-zA-Z0-9], \W : 문자와 숫자가 아닌 문자열들을 매칭
2) Dot(.)
- 이 정규식은 줄바꿈 문자\n을 제외한 모든 문자와 매치됨
- a.b 는 "a + 모든문자 + b" 를 의미
즉 a와 b라는 문자 사이에 어떤 문자가 들어가도 모두 매치됨을 의미
3) 반복(*)
- 은 바로 앞에 있는 문자를 0부터 무한대로 반복될 수 있단 의미
- 반복 횟수 0부터
- {0,} 와 동일
4) 반복(+)
- +는 최소 1번 이상 반복될 때 사용
- {1,} 와 동일
5) 반복({m,n},?)
- 반복횟수를 고정하고 싶을 때 사용
- {m,} 는 반복 횟수가 m 이상인 경우
- {,n} 는 반복 횟수가 n 이하인 경우
- 생략된 m은 0
- 생략된 n은 무한대
➊ {m}
- 예시 : ca{2}t
의미 : c+a(반드시 2번 반복)+t
➋ {m,n}
- 예시 : ca{2,5}t
의미 : c+a(2~5회 반복)+t
➌ ?
- {0,1} 의미
- 예시 : ca?t
의미 : c+a(있어도 되고 없어도 된다)+t
2. 파이썬에서 정규 표현식을 지원하는 re모듈
import re
p = re.compile('ab*')
3. 정규식을 이용한 문자열 검색
>>> import re
>>> p = re.compile('[a-z]+')
- match, search는 정규식과 매치될때 객체를 돌려주고, 매치 되지 않을 땐 None을 돌려준다.
1) match
- 문자열의 처음부터 정규식과 매치되는지 조사
- 정규식과 매치
>>> m = p.match("python")
>>> print(m)
<_sre.SRE_Match object at 0x01F3F9F8>
>>> m = p.match("3 python")
>>> print(m)
None
2) search
- 문자열 전체를 검색하여 매치되는 게 있는지 확인
- match 메서드와는 처음부터 검색할지의 여부 차이
3) findall
>>> result = p.findall("life is too short")
>>> print(result)
['life', 'is', 'too', 'short']
4) finditer
- 반복 가능한 객체를 돌려줌
- 반복 가능한 객체가 포함하는 각각의 요소는 match 객체
4. match, search 객체의 메서드
5. 메타문자
1. or과 동일한 문자 : |
2. 문자열 맨 처음과 일치함을 의미 : ^
3. 문자열의 끝과 매치함을 의미 : $
4. 문자열 처음과 매치 : \A
단, re.MULTILINE 옵션을 사용할 경우 줄과 상관없이 전체 문자열의 처음하고만 매치
5. 문자열 끝과 매치 : \Z
단, re.MULTILINE 옵션을 사용할 경우 전체 문자열의 끝과 매치
6. 단어 구분자 : \b
6. 그루핑 ()
예시
import re
input_user = input()
rule = re.compile('[a-c]+')
one = re.findall('b',input_user)
two = re.findall(rule,input_user)
three = re.findall('(\\w)(\\1*)',input_user)
print(one)
print(two)
print(three)
결과
aaabbccccdefff
['b','b']['aaabbcccc']
[('a','aa'),('b','b'),('c','ccc'),('d',''),('e',''),('f','ff')]