사용언어 : python
re.sub 함수와 정규표현식을 이용하여 푸는게 Best지만! 어려워 일부분만 적용했습니다.🤣
re.sub은 문자열에서 특정 문자를 치환하는 함수로
re.sub('패턴','새로운패턴(바꿀패턴)','문자열')
이렇게 사용할 수 있습니다.
1단계
new_id
의 모든 대문자를 대응되는 소문자로 치환합니다.
=> 문자열.lower()를 사용하여 모든 대문자를 소문자로 치환
2단계
new_id
에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(), 마침표(.)를 제외한 모든 문자를 제거합니다.
=> re.sub(r'[^a-z0-9-.]', '', new_id)
=> 정규표현식을 이용
=> 대괄호([])속 ^ 는 제외를 의미한다.
3단계
new_id
에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.
=> re.sub(r'[.]{2,}', '.', new_id)
=> 정규표현식 이용
=> {2,}은 '.'이 2개 이상을 의미
4단계
new_id
에서 마침표(.)가 처음이나 끝에 위치한다면 제거합니다.
=> new_id = new_id.strip('.')
=>strip()
함수는 문자열 앞뒤에서 주어진 문자를 제거
5단계
new_id
가 빈 문자열이라면, new_id에 "a"를 대입합니다.
=> if문 사용
6단계
new_id
의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다.
만약 제거 후 마침표(.)가new_id
의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다.
=> if문 사용
7단계
new_id
의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.
=> while문으로 반복
import re
def solution(new_id):
new_id = new_id.lower() # 1단계
new_id = re.sub(r'[^a-z0-9-_.]', '', new_id) # 2단계
new_id = re.sub(r'[.]{2,}', '.', new_id) # 3단계
print(new_id)
new_id = new_id.strip('.')
if len(new_id) == 0:
new_id = "a"
if len(new_id) >= 16:
new_id = new_id[:15]
if new_id[-1] == ".":
new_id = new_id[:-1]
while len(new_id) <= 2:
new_id = new_id + new_id[-1]
answer = new_id
return answer
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
확실히 정규표현식을 사용하니 깔끔하다. 좀 더 공부하기!
정규식 엔진은 python의 in 키워드보다 느려서, 패턴이 복잡해지는 경우 c나 java가 아니라 python보다 느려질 수 있어요.
문자열 매칭 및 치환과 관련된 github repo 참고해서 공부하면 도움이 될 것 같아 공유드립니다. 🙂
https://github.com/vi3k6i5/flashtext
주의
flashtext는 word to word replace 만 제공합니다.