문자 클래스
- \d
- \D
- 숫자가 아닌 것과 매치 [^0-9]와 동일한 표현식
- \s
- 화이트스페이스(whitespace) 문자와 매치 [ \t\n\r\f\v]와 동일한 표현식, 맨 앞의 빈칸은 공백 문자(space를 의미)
- \S
- 화이트스페이스 문자가 아닌 것과 매치 [^ \t\n\r\f\v]와 동일한 표현식
- \w
- 문자+숫자(alphanumeric)와 매치 [a-zA-Z0-9_]와 동일한 표현식
- \W
- 문자+숫자(alphanumeric)가 아닌 문자와 매치 [^a-zA-Z0-9_]와 동일한 표현식
- .(dot) 문자
- * 문자
- * 바로 앞에 있는 문자가 0부터 무한대까지 반복될 수 있다는 의미
- + 문자
- +는 최소 1번 이상 반복될 때 사용, *가 반복 횟수가 0부터라면 +는 반복 횟수가 1부터인 것
- {} 문자와 ? 문자
- 반복 횟수를 3회만 또는 1회부터 3회까지만으로 제한하고 싶을 때 {} 메타 문자를 사용하면 반복 횟수를 고정할 수 있음. {m, n} 정규식을 사용하면 반복 횟수가 m부터 n까지인 문자와 매치. m 또는 n을 생략할 수도 있다. 만약 {3,}처럼 사용하면 반복 횟수가 3 이상인 경우이고 {, 3}처럼 사용하면 반복 횟수가 3 이하인 경우를 의미함. 생략된 m은 0과 동일하며, 생략된 n은 무한대(약 2억 개 미만)의 의미를 갖는다.
a.b # a + 모든 문자 + b
a[.]b # a + . + b
ca*t # a가 0번이상 반복 ex)ct, cat, caat, caaa..t
ca+t # a가 1번이상 반복 ex) cat, caat, caaa..t
ca{2}t # a가 반드시 2번 반복
ca{2,5}t # a가 2~5번 반복
ab?c # b가 있어도 되고 없어도 됨 ex) ac,abc
정규식을 이용한 문자열 검색
- findall()
- 정규식과 매치되는 모든 문자열(substring)을 리스트로 리턴
import re
a = 'a1B2c f g00HH'
re.findall(r'\d',a) # 1
re.findall(r'\D',a) # 2
re.findall(r'\s',a) # 3
re.findall(r'\S',a) # 4
re.findall(r'\w',a) # 5
re.findall(r'\W',a) # 6
['1', '2', '0', '0'] # 1 숫자만
['a', 'B', 'c', ' ', ' ', ' ', 'f', ' ', 'g', 'H', 'H'] # 2 숫자가 아닌것만
[' ', ' ', ' ', ' '] # 3 화이트 스페이스만
['a', '1', 'B', '2', 'c', 'f', 'g', '0', '0', 'H', 'H'] # 4 화이트 스페이스가 아닌 것만
['a', '1', 'B', '2', 'c', 'f', 'g', '0', '0', 'H', 'H'] # 5 문자+숫자만
[' ', ' ', ' ', ' '] # 6 문자+숫자가 아닌 것만
import re
a = 'a1B2c f g00HH'
# 숫자면 '-'로 치환
re.sub(r"\d","-",a) # 출력: a-B-c f g--HH
# 숫자가 아니면 '-'로 치환
re.sub(r"[^\d]","-",a) # 출력: -1-2-------00--
- match()
- search()
- 문자열 전체를 검색하여 정규식과 매치되는지 조사
- finditer()
- 정규식과 매치되는 모든 문자열(substring)을 반복 가능한 객체로 리턴
import re
p = re.compile('[a-z]+')
m = p.match("python") # "python" 문자열은 [a-z]+ 정규식에 부합되므로 match 객체가 리턴
print(m) # 출력: <re.Match object; span=(0, 6), match='python'>
m = p.match("3 python") # "3 python"은 처음에 나오는 문자 3이 [a-z]+에 부합되지 않으므로 None이 리턴
print(m) # 출력: None
m = p.search("python")
print(m) # 출력: <re.Match object; span=(0, 6), match='python'>
m = p.search("3 python")
print(m) # 출력: <re.Match object; span=(2, 8), match='python'>
result = p.finditer("life is too short")
print(result) # 출력: <callable_iterator object at 0x01F5E390>
for r in result:
print(r)
# 출력:
# <re.Match object; span=(0, 4), match='life'>
# <re.Match object; span=(5, 7), match='is'>
# <re.Match object; span=(8, 11), match='too'>
# <re.Match object; span=(12, 17), match='short'>
match 객체의 메서드
- group
- start
- end
- span
- 매치된 문자열의 (시작, 끝)에 해당하는 튜플을 리턴한다.
m = p.match("python")
m.group() # 출력: 'python'
m.start() # 출력: 0
m.end() # 출력: 6
m.span() # 출력: (0, 6)
m = p.search("3 python")
m.group() # 출력: 'python'
m.start() # 출력: 2
m.end() # 출력: 8
m.span() # 출력: (2, 8)