▶ 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번 반복
# ^ : 문자열의 처음
# $ : 문자열의 끝
# 문자열 처음 ~ 끝 지정해주는 이유 ? : 무조건 여기서 범위는 문자열의 처음~끝 으로 고정으로 해야 예외가 안생김
'코테 핵심노트 > 노트' 카테고리의 다른 글
노트 #6: 파이썬 2차원 배열 선언(초기화) (0) | 2020.05.22 |
---|---|
노트 #5 : 파이썬 join() (0) | 2020.05.18 |
노트#4 : 파이썬 리스트 조합 구하기 (0) | 2020.05.13 |
노트#2 : 파이썬 리스트의 값들을 전부 int로 바꾸기 (0) | 2020.05.13 |
노트 #1 (0) | 2020.05.10 |