[문제 링크]
https://programmers.co.kr/learn/courses/30/lessons/72410
[소스코드]
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
정규표현식
- 사용법 (
import re
필요)
import re
# 1. 정규표현식 객체를 컴파일해서 사용.
regex=re.compile('[a-z\')
# 2. 위 문제처럼 메소드만 문제푸는데 사용
ex = re.sub('[^a-z0-9\-_.]', '', st)
ex = re.match('[a-z]+', "python")
- 정규식 객체 생성 > 생성된객체.method를 이용하는 방법과 re.메소드를 바로 이용하는 방법이 있는데 본질적으로 같으므로 라인이 짧은 메소드를 바로 이용하는 쪽을 선택하자.
- 메소드
re.match(pattern,string)
: re.match object 반환 (없으면 None 반환), 첫단어가 일치해야한다.re.search(pattern,string)
: re.match object 반환, 문장 전체에서 찾아준다.re.match
나re.search
에서 반환되는 객체에.group()
을 취해줘야 결과를 얻을 수 있다.re.findall(pattern,string)
: 전부 찾아서 리스트로 반환해준다.re.finditer(pattern,string)
: 제너레이터로 반환해준다.re.sub(pattern,대체할문자,string)
: replace와 비슷하게 동작, 타겟을 여러개로 정할 수 있다는 장점이 있음.
import re
# match
m=re.match('[a-z]+',"python111love")
print(m) #<re.Match object; span=(0, 6), match='python'>
print(m.group()) #python
m=re.match('[a-z]+',"111love")
print(m) #None
# search
print(re.search('[a-z]+',"111love222python").group()) #love
# findall
print(re.findall('[a-z]+',"11python22love33google")) # ['python', 'love', 'google']
# finditer
for i in (re.finditer('[a-z]+',"11python22love33google")):
print(i.group())
# python
# love
# google
[풀이]
- 소문자로 전환
- -,_,.제거
- .이 2번 이상 쓰인 부분 1번만
- 시작, 끝 . 제거
- 빈문자나 초과 문자 처리.
- 마침표 한번 더 제거.
- 길이가 2 이하일 경우 마지막자리 덧붙이기