7단계의 순차적인 처리 과정을 통해 유저가 입력한 아이디가 규칙에 맞는 지 검사하고, 규칙에 맞지 않은 경우 새로운 아이디를 추천하라.
1. new_id의 모든 대문자를 소문자로 치환
2. new_id에서 알파벳 소문자, 숫자, ‘-’, ‘_’, ‘.’ 제외한 모든 문자 제거
3. new_id에서 ‘.’가 두 번 이상 연속된 부분을 하나의 ‘.’로 치환
4. new_id에서 ‘.’가 처음이나 끝에 위치하면 제거
5. new_id가 빈 문자열이면, new_id에 ‘a’ 대입
6. new_id 길이가 16 이상이면, new_id를 처음부터 15개 문자를 제외한 나머지 문자 모두 제거, 제거 후 ‘.’가 맨 끝에 위치하면 제거
7. new_id 길이가 2 이하면 new_id 마지막 문자를 new_id 길이가 3이 될 때까지 반복해서 끝에 붙임
친절히 설명된 규칙처럼, 그대로 구현해내면 됨
단계를 그대로 구현했으나, 시간 초과가 뜬다.
def solution(new_id):
answer = ‘’
# 1
new_id = new_id.lower()
# 2
for c in new_id:
if c.isalpha() or c.isdigit() or c in [‘_’, ’-’, ‘.’]:
answer += c
# 3
while ‘..’ in answer:
answer = answer.replace(‘..’, ‘.’)
# 4
if answer[0] == ‘.’:
answer = answer[1:] if len(answer) > 1 else ‘.’
if answer[-1] == ‘.’:
answer = answer[:-1]
# 5
if answer == ‘’:
answer = ‘a’
# 6
if len(answer) > 15:
answer = answer[:15]
if answer[-1] == ‘.’:
answer = answer[:-1]
# 7
while len(answer) < 3:
answer += answer[-1]
return answer
import re
def solution(new_id):
st = new_id
# 1
st = st.lower()
# 2
st = re.sub('[^a-z0-9\-_.]', '', st)
# 3
st = re.sub('\.+', '.', st)
# 4
st = re.sub('^[.]|[.]$', '', st)
# 5 # 6
st = 'a' if len(st) == 0 else st[:15]
st = re.sub('^[.]|[.]$', '', st)
# 7
st = st if len(st) > 2 else st + "".join([st[-1] for i in range(3-len(st))])
return st
복잡한 문자열을 처리할 때 사용하는 기법으로, 메타 문자를 사용한다.
메타 문자란?
- 원래 그 문자가 가진 뜻이 아닌 특별한 용도로 사용하는 문자로, 다음과 같은 것이 있다.
. ^ & * + ? {} [] / | ()
문자 클래스
[]
- 문자 클래스로 만들어진 정규식은
[] 사이의 문자들과 매치
라는 의미를 갖는다.- [] 안의 두 문자 사이에
하이픈(-)
을 사용하면두 문자 사이의 범위
를 의미한다.- [] 안에는 어떤 문자나 메타 문자도 사용 가능하다.
^
$
^
: 문자열 맨 앞부터 일치하는 경우를 검색$
: 문자열 맨 뒤에서 일치하는 경우를 검색패턴 뒤의
+
*
?
- 위 문자들은 패턴 뒤에 위치하면, 해당 패턴이 반복적으로 존재하는지 검사한다.
+
: 1번 이상
*
: 0번 이상
?
: 0번 혹은 1번 이상
re.sub( pattern, sub_word, script )
pattern
: 찾고 싶은 것
sub_word
: 바꾸고 싶은 것(특정 문자열 또는 함수일 수 있음)
script
: 찾을 곳- sub 함수는 주어진 문자열에서 일치하는 모든 pattern을 replace하여 그 결과를 문자열로 반환함.