정규표현식이란?
정규표현식(Regular expressions)은 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어이다. 복잡한 문자열의 검색과 치환을 위해 사용된다.
정규표현식을 사용하기 위해서는 re 모듈을 사용해야 하는데, 이는
import re를 통해 사용할 수 있다.
reg = re.compile('[05]+')
for i in range(l, r+1):
m = reg.findall(str(i))
print(m)
"""
# 결과
['5']
[]
[]
[]
[]
['0']
.
.
.
"""
re.compile을 사용하여 정규표현식을 컴파일할 수 있으며, 이 리턴값(reg)을 reg에 할당해 이후의 작업을 수행할 수 있다.
컴파일하고자 하는 '[05]+'의 의미는
'[' 와 ']' 사이의 문자들과 매치라는 의미를 갖고 있는데,
즉, 정규 표현식이 [abc] 라면 이 의미는 'a, b, c' 중 어느 것이라도 있으면 매치' 라는 뜻이다.
(대괄호 사이에 '-'을 넣으면 범위를 의미하게 된다. 예를 들어 1~9는 [1-9] 이며,
'^'는 제외하고자 하는 의미이며, 예를 들어 [^0-9]는 숫자를 제외한다는 의미이다.
또한 '+' 문자는 반복을 나타내는 문자로, 최소 1번 이상 반복될 때 사용하는 것인데,
예를 들어 [ca+t] 라는 정규식에서는 ct는 매칭되지 않고, cat, caaaaaaaaaaaat 등이 매칭된다!
문제에서 예시를 보자.
2023.12.28 - [코딩테스트/PYTHON] - [프로그래머스][PYTHON] Lv. 0 배열 만들기 2
따라서, 문제에서는 0과 5만으로 사용된 문자를 뽑아내고 싶으므로,
re.compile('[05]+')
을 사용하였는데, 정리하자면 0 혹은 5가 포함된 문자 중 0과 5가 최소 1번 이상 반복된 것을 뽑아온다.
그리고,
for i in range(l, r+1):
을 통해 l부터 r+1까지 범위를 순회하는데,
m = reg.findall(str(i))
를 통해 앞에서 매치되는 모든 값을 찾아 m(리스트)으로 반환다는 것이다!
이 때, m의 값은 비어있거나, 겹치는 값이 있거나, 매칭되는 값이 여러개일 수 있기 때문에 조건문을 통해 걸러준다.
예를 들어
1) [50555506665555]
는 ['5055550', '5555']로 나오기 때문에 우리가 원하는 값이 아니다.
또한,
2) [5555123]
은 ['5555']로 나오기 때문에 이 역시 우리가 원하는 값이 아니다.
1번 케이스의 경우는 m 리스트의 길이가 1일 때만 추출함으로써 예외를 해결할 수 있고,
2번 케이스의 경우에는 m 리스트의 첫 번째 값과 원하는 문자의 길이가 같을 때만을 추출함으로써 해결할 수 있다!
최종적으로 정규표현식을 사용한 답은 이와 같다!
import re
def solution(l, r):
answer = []
reg = re.compile('[05]+')
for i in range(l, r+1):
m = reg.findall(str(i))
if len(m)==1 and len(m[0]) == len(str(i)): answer.append(i)
return answer if len(answer) > 0 else [-1]
끄읏-!
'PYTHON' 카테고리의 다른 글
[PYTHON] 리스트 원소 타입 바꾸기 - map (0) | 2024.02.05 |
---|---|
.ipynb 파일을 .py파일로 변경하기 (0) | 2024.02.04 |
[PYTHON] 2차원 배열 정렬하기 (0) | 2024.02.02 |
[PYTHON] 딕셔너리(dict) 생성, 정렬, 순회 (0) | 2024.02.02 |
[PYTHON] lambda 함수 활용(map, reduce, filter) (0) | 2024.02.02 |