출처: 프로그래머스 코딩 테스트 연습, [프로그래머스] 신규 아이디 추천
문제에 나와있는 그대로 구현하였다. 정규표현식이 아닌 조건문이나 반복문을 이용해서 풀어도 되지만 이미 정규표현식으로 푸는 문제라는 힌트를 받고 풀어 정규표현식을 이용하여 풀었다.
다른 사람 풀이에서는 모두 정규표현식으로 풀었다면 아직 정규표현식이 익숙하지 않아 문자열 함수도 섞여 있다.
strip('문자'), rstrip('문자')
1단계 new_id의 모든 대문자를 대응되는 소문자로 치환합니다. : lower()
으로 대문자를 모두 소문자로
2단계 new_id에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거합니다. : re.findall(정규식, 문자열)
, 문자열.join(리스트)
조건에 맞는 모든 문자를 리스트로 찾고 리스트를 문자열로 변환
3단계 new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다. : re.sub(정규식, 치환될문자, 문자열)
반복되는 .
을 정규식 \.+
을 사용하여 찾고 .
으로 치환해준다.
4단계 new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거합니다. : 문자열.strip(문자)
를 통해 양끝의 .
삭제
5단계 new_id가 빈 문자열이라면, new_id에 "a"를 대입합니다. : 파이썬 삼항표현식으로 구현
6단계 new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다.
만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다. : 문자열.rstrip(문자)
로 오른쪽 끝 .
삭제
7단계 new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다. : 파이썬 삼항표현식 구현
import re
def solution(new_id):
new_id = new_id.lower()
new_id = ''.join(re.findall('[a-z0-9-_.]', new_id))
new_id = re.sub('\.+', '.', new_id)
new_id = new_id.strip('.')
new_id = 'a' if new_id == '' else new_id
new_id = new_id[:15].rstrip('.') if len(new_id) >= 16 else new_id
new_id = new_id + new_id[-1] * (3 - len(new_id)) if len(new_id) <= 2 else new_id
return new_id
파이썬의 많은 문법이 필요로하는 문제였고 어떻게 아이디를 필터링할지 모두 알려주어 레벨1이지 아니였으면 엄청 어려웠을 것 같다. 이 문제를 계기로 정규표현식과 조금더 친해져야겠다.