https://programmers.co.kr/learn/courses/30/lessons/72410
이 문제는 문자열을 다루는 문제로, 오래 전에 이미 풀었었다. 그런데 얼마 전 포스팅한 정규식을 이용하면 더 간단하게 풀 수 있을 듯 하여 다시 풀어보고, 이전의 풀이와 비교해보았다. 문제를 풀면서 파이썬에서의 정규식 사용법 또한 알아볼 것이다.
주어진 문자열을 아래의 조건에 따라 필터링해서 리턴하는 문제이다.
이 문제는 알고리즘 지식을 필요로 하기보다는 시키는 대로 하면 풀리는 문제이다. 특정 문자를 제거하거나 치환하는 조건들이 많아 정규식을 이용하면 좋을 것 같다. 문제를 풀기 전에, 파이썬에서는 정규식을 어떻게 사용하는지 알아본 후 그를 이용해 문제를 풀이할 것이다.
파이썬은 정규 표현식을 사용할 수 있는 re(regular expression)
모듈을 제공한다. re 모듈은 파이썬에 내장된 기본 라이브러리이다. 문제에서 필요한 치환 기능을 사용하려면, re.sub
메소드를 사용하면 된다. 사용법은 re.sub(pattern, new_text, text)
으로, text
중에서 pattern
에 맞는 부분을 new_text
로 대체한다.
import re
text = "I am student"
new_text = re.sub('\w', "*", text)
print('new text:', new_text)
text
에 있는 모든 문자를 *
로 치환하는 코드로, 결과는 다음과 같이 잘 동작한다.
그러면 예전에 풀었던 코드와, 이 re.sub를 사용한 풀이를 비교해보자.
def solution(new_id):
answer = ''
# 1단계: 소문자로 변환
new_id = new_id.lower()
# 2단계: 소문자, 숫자, -, _, . 제외한 모든 문자 제거
for word in new_id:
if word.isalnum() or word in '-_.':
answer += word
# 3단계 : 마침표 2번 이상 > 하나로
while '..' in answer:
answer = answer.replace('..','.')
# 4단계 : 양 끝 마침표 제거
answer = answer[1:] if answer[0] == '.' and len(answer) > 1 else answer
answer = answer[:-1] if answer[-1] == '.' else answer
# 5단계 : 빈 문자열이면 a 대입
answer = 'a' if answer == '' else answer
# 6단계 : 길이가 16자 이상이면 1~15자만 남기기 & 맨 끝 마침표 제거
if len(answer) >= 16:
answer = answer[:15]
if answer[-1] == '.':
answer = answer[:-1]
# 7단계 : 길이가 3이 될 때까지 반복해서 끝에 붙이기
if len(answer)<=3:
answer = answer + answer[-1] * (3-len(answer))
return answer
import re
def solution(new_id):
answer = ''
# 1단계: 소문자로 변환
answer = new_id.lower()
# 2단계: 소문자, 숫자, -, _, . 제외한 모든 문자 제거
answer = re.sub('[^a-z\d\-\_\.]', '', answer)
# 3단계 : 마침표 2번 이상 > 하나로
answer = re.sub('\.\.+', '.', answer)
# 4단계 : 양 끝 마침표 제거
answer = re.sub('^\.|\.$', '', answer)
# 5단계 : 빈 문자열이면 a 대입
if answer == '':
answer = 'a'
# 6단계 : 길이가 16자 이상이면 1~15자만 남기기 & 맨 끝 마침표 제거
answer = re.sub('\.$', '', answer[0:15])
# 7단계 : 길이가 3이 될 때까지 반복해서 끝에 붙이기
while len(answer) < 3:
answer += answer[-1:]
return answer