문제를 보자마자 정규표현식을 쓰면 쉽게 풀수 있겠구나 생각이 들었지만 정규표현식을 까먹어서 일단 다른 방식으로 풀다가 결국 찾아보고 정규표현식으로 푼 문제다. 정규표현식 사용법 까먹지말자!!!
import re # regex 정규표현식을 쓰는 모듈
def solution(new_id):
answer = ''
# 1단계 소문자 치환
answer = new_id.lower()
# 2단계 소문자 치환 숫자, -,_,. 제외하면 다제거
answer = re.sub('[^a-z\d\-\_\.]', '', answer)
# 3단계 마침표 2번 이상을 하나로
answer = re.sub('\.{2,}', '.', 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
print(solution('.h..a...h.a......hBSSDG-__@@..||.'))
JavaScript
복사
1단계 new_id소문자로 치환
2단계 소문자(a-z) 숫자(\d) -_. 가 아닌문자면([] ^) 빈칸으로 치환
\d 를 0-9로 바꿔도 된다.
3단계 .이(\.) 한번 이상 반복되면({2,}) . 하나로 치환 {1,} 은 + 와 같다.
{1,} 로 제출해도 정답처리되고 솔직히 하나 이상 반복이라는 말을 무슨소리인지 잘 모르겠다.
.이 하나면 . 으로 바꾸고 ..도 . 으로 바꾸는거라 .은 그냥 냅두던 말던 상관 없어서 결과가 같은거다.
*이라는 0번 이상 반복도 있다.
4단계 . 으로 시작(^\.) 하는것 또는 .으로 끝나는거(\.$) 는 공백으로 치환
(^\.)
문자 클래스([]) 안에서는 ^가 not 의 의미를 가진다. 즉 [^0-9] 은 숫자가 아닌 경우다.
5단계 생략
6단계 애초에 받을때 answer 로 슬라이싱해서 15 글자까지만 받음
7단계 answer += answer[-1: ]. answer의 마지막 글자를 끝에 붙인다.
re.sub(패턴, 교체되어질 문자열, 문자열, 최대 교체 수, 플래그)
sub는 문자열에 맞는 패턴을 2번째 인자(교체할 문자열)로 교체합니다. 최대 교체 수를 지정하면 문자열에 맞는 패턴을 교체할 문자열로 교체하고 그 수가 도달하면 더이상 교체하지 않습니다.
import re
print(re.sub('a', 'z', 'ab'))
print(re.sub('a', 'zxc', 'ab'))
print(re.sub('a', 'z', 'aaaab'))
print(re.sub('a', 'z', 'aaaab', 1))
# zb
# zxcb
# zzzzb
# zaaab
Plain Text
복사
점프투 파이썬 정규표현식시작하기