▶ re.findall
# re.findall(pattern, string) : 매칭되는것들을 배열로 리턴
import re
inputString = 'aa1b2c3'
# []: []사이의 문자들과 매칭
p = '[a-zA-Z]'
result = re.findall(p, inputString)
print(result) # ['a', 'a', 'b', 'c']
# .은 \n을 제외한 모든 문자와 매치
p = 'a.1'
result = re.findall(p, inputString)
print(result) # ['aa1']
p = '[0-9]'
result = re.findall(p, inputString)
print(result) # ['1', '2', '3']
st = '\d'
p = re.compile(st)
result = re.findall(p, inputString)
print(result) # ['1', '2', '3']
p = '[^0-9]'
result = re.findall(p, inputString)
print(result) # ['a', 'a', 'b', 'c']
p = '[a-zA-Z0-9]'
result = re.findall(p, inputString)
print(result) # ['a', 'a', '1', 'b', '2', 'c', '3']
p = '\w'
result = re.findall(p, inputString)
print(result) # ['a', 'a', '1', 'b', '2', 'c', '3']
inputString = 'ct'
# *은 * 바로 앞에 있는 문자 a가 0부터 무한대로 반복될 수 있다는 의미이다.
p = 'ca*t'
result = re.findall(p, inputString)
print(result) # ['ct']
# +는 최소 1번 이상 반복될 때 사용한다. 즉 *가 반복 횟수 0부터라면 +는 반복 횟수 1부터인 것이다.
p = 'ca+t'
result = re.findall(p, inputString)
print(result) # []
inputString = 'caat'
# {2} : 반드시 2번 반복
p = 'ca{2}t'
result = re.findall(p, inputString)
print(result) # ['caat']
# {2,5} : 2~5번 반복
p = 'ca{2,5}t'=
result = re.findall(p, inputString)
print(result) # ['caat']
inputString = 'ac'
# ? : 있어도 되고 없어도 된다
p = 'ab?c'
result = re.findall(p, inputString)
print(result) # ['ac']
▶ re.sub
# re.sub(pattern, repl, string) : string에서 pattern과 매치하는 텍스트를 repl로 치환한다
# 문제)
# aabbbca -> ['aa', 'bbb', 'c'] -> 2a3bc
# aabbbca -> ['aa', 'bbb', 'c', 'a'] -> 2a3bca
# abbcabb -> ['a', 'bb', 'c', 'a', 'bb'] -> a2bca2b
# 풀이)
import re
inputString = 'aabbbca'
p = r'(.)(\1+)'
repl = lambda c: str(len(c.group())) + c.group(1)
result = re.sub(p, repl, inputString)
print(result) # 2a3bca
# r : Raw String. 컴파일해야하는 정규식이 'Raw String'임을 알려줌
# 괄호()를 써서 묶은 부분은 '1번부터 시작하는 그룹'으로 참조할 수 있다.
(.) -> 1번 그룹
# 앞서 매치한 그룹을 '패턴 내에서 재사용'하려면 \1과 같이 그룹번호를 역슬래시로 이스케이프하여 표현한다.
▶ re.match
# re.match(pattern, string) : string에서 pattern과 매치하는 텍스트를 탐색한다
# 문제)
# MAC Address는 항상 0~9,A~F사이의 값으로만 2개씩 총 6묶음으로 이루어져 있다.
# MAC Address는 항상 똑같은 형식, 똑같은 길이를 갖는다.
# 풀이)
import re
inputString = "00-1B-63-84-45-E6"
p = '^([\dA-F]{2}-){5}([\dA-F]{2})$'
result = bool(re.match(p, inputString))
print(result) # True
# \d : 숫자를 나타냄
# {2} : 반드시 2번 반복
# ^ : 문자열의 처음
# $ : 문자열의 끝
# 문자열 처음 ~ 끝 지정해주는 이유 ? : 무조건 여기서 범위는 문자열의 처음~끝 으로 고정으로 해야 예외가 안생김