PYTHON

[PYTHON] 정규표현식 활용하기

_알파카 2024. 2. 2. 15:10
728x90

정규표현식이란?

정규표현식(Regular expressions)은 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어이다. 복잡한 문자열의 검색과 치환을 위해 사용된다. 

https://wikidocs.net/4308

 

08-2 정규 표현식 시작하기

정규 표현식에서는 메타 문자(meta characters)를 사용한다. 먼저 메타 문자가 무엇인지 알아보자. [TOC] ## 정규 표현식의 기초, 메타 문자 메타 문자란 원…

wikidocs.net

정규표현식을 사용하기 위해서는 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

 

[프로그래머스][PYTHON] Lv. 0 배열 만들기 2

문제설명 https://school.programmers.co.kr/learn/courses/30/lessons/181921 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합

yeonnys.tistory.com

 

따라서, 문제에서는 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]

 

끄읏-!

728x90