string.upper(): 대문자 변환
string.lower(): 소문자 변환
def solution(new_id):
new_id = list(new_id)
flag = {'-','_','.'}
#1. 대문자 소문자 치환
for i in range(len(new_id)):
if new_id[i].isupper():
new_id[i] = new_id[i].lower()
#2. 소문자,숫자,-,_,. 제외 문자 제거
for i in range(len(new_id)):
if not new_id[i].isalpha() and not new_id[i].isdigit() and new_id[i] not in flag:
new_id[i] = ''
new_id = list("".join(new_id))
#3. . 여러 개 하나로 치환
for i in range(len(new_id)):
if new_id[i] == '.':
while i+1 < len(new_id) and new_id[i+1] == '.':
new_id[i+1] = ''
i += 1
new_id = list("".join(new_id))
#4. 마침표 처음 끝 제거
if new_id[0] == '.':
new_id[0] = ''
if new_id[-1] == '.':
new_id[-1] = ''
new_id = list("".join(new_id))
#5. new_id = blank --> 'a'
if new_id == []:
new_id = ['a']
#6. 길이 16자 이상: 처음 15개까지
if len(new_id) >= 16:
new_id = new_id[:15]
if new_id[-1] == '.':
new_id[-1] = ''
new_id = list("".join(new_id))
#7. 길이 2자 이하: 마지막 문자로 3개까지 채움
if len(new_id) <= 2:
while len(new_id) < 3:
new_id.append(new_id[-1])
return "".join(new_id)
코드를 작성하면서도 "이렇게 푸는 것이 맞나..?" 하는 의문이 들었다.
당연히 아니었다. 이런 단순무식한 방법보다 더욱 빠르고 간결한 코드가 있었으니!
바로 정규 표현식을 활용한 코드다.
import re
def solution(new_id):
st = new_id
st = st.lower()
st = re.sub('[^a-z0-9\-_.]', '', st)
st = re.sub('\.+', '.', st)
st = re.sub('^[.]|[.]$', '', st)
st = 'a' if len(st) == 0 else st[:15]
st = re.sub('^[.]|[.]$', '', st)
st = st if len(st) > 2 else st + "".join([st[-1] for i in range(3-len(st))])
return st