新しいIDの推奨


質問元:プログラマ

質問の概要

신규아이디 추천
- 네오는 유저들이 규칙에 맞지 않는 아이디를 입력했을 때, 
- 입력한 아이디와 유사하면서 규칙에 맞는 아이디를 추천해주는 프로그램을 개발해야 한다. 

규칙) 
- 아이디의 길이는 3~ 15- 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.) 만 사용 가능 
-, 마침표(.)는 처음과 끝에 사용할 수 없으며, 연속으로 사용 불가
- 빈문자열이 되면 a로 채우고, 길이가 부족하면 바로 앞문자 반복
- 길이가 넘어가면 뒤의 문자열은 제외

입력)
new_id = '...!@BaT#*..y.abcdefghijklm'

출력)
result = 'bat.y.abcdefghi'

コード#コード#

def solution(new_id):
    answer = ''
    # 1. 소문자 적용
    new_id = new_id.lower()
    
    # 2. 숫자, 빼기(-), 밑줄(_), 마침표(.)만 추가하기 
    for char in new_id:
        if char.isalpha() or char.isdigit() or char in ['-', '_', '.']:
            answer += char
    
    # 3. 마침표 2개인 경우 1개로 대체 
    while '..' in answer:
        answer = answer.replace('..','.')
    
    # 4. 마침표 맨앞 맨뒤 제거
    if answer[0] == '.': # answer 길이가 1보다 작으면 그냥 . 두기 
        answer = answer[1:] if len(answer) > 1 else '.'
    if answer[-1] == '.':
        answer = answer[:-1]
    
    # 5. 빈문자열엔 a 넣기 
    if answer == '':
        answer = 'a'
        
    # 6. 15자 넘어가면 뒤에 자르기
    if len(answer) > 15:
        answer = answer[:15]
        if answer[-1] == '.':
            answer = answer[:-1]
            
    # 7. 3자 미만이면 맨 뒷글자 넣어주기
    while len(answer) < 3:
        answer += answer[-1]
    
    return answer
solution('...!@BaT#*..y.abcdefghijklm')
'bat.y.abcdefghi'

正規表現でのコードの使用

import re

def solution(new_id):
    st = new_id
    st = st.lower() # 소문자
    st = re.sub('[^a-z0-9\-_.]', '', st) # 정해진 문자빼고 다빼기
    st = re.sub('\.+', '.', st) # 2개이상이면 하나로 바꾸기
    st = re.sub('^[.]|[.]$', '', st) # 맨앞 맨뒤 점이면 없애기
    st = 'a' if len(st) == 0 else st[:15] # 길이가 0이면 a 넣고 아니면 15자까지 두기
    st = re.sub('^[.]|[.]$', '', st) # 15자까지 둔 경우 마침표 맨앞맨뒤 검사
    st = st if len(st) > 2 else st + "".join([st[-1] for i in range(3-len(st))]) 
    # 길이가 2보다 작으면 맨뒤문자 반복
    return st
solution('...!@BaT#*..y.abcdefghijklm')
'bat.y.abcdefghi'