정규표현식이란 긴 텍스트 셋에서 찾을 수 있는 문자열 / 패턴 표현하기 위해 구성하는 기호 or 문자의 부분집합이다.
텍스트 편집기에서 ‘찾아 바꾸기’ 를 사용하는 것과 같은 역할이다.
날짜-시간 혹은 이메일같은 특정한 형식으로 제한하거나 강제하는 것이 가능하다
파이썬에선 re 모듈 ( 파이썬 설치시 함께 포함 )로 사용이 가능하지만 regex라이브러리를 설치하면 고급 내장함수 사용이 가능하다.
정규표현식의 기본
메타문자 - 특별한 의미를 가진 문자
•
[ ] : 문자집합
◦
“[a-m]”- range를 의미하며 a-m사이 문자 의미
◦
“[xy]” - 문자선택을 표현. x와 y 중 하나 의미
◦
“[^xy]” - not. x및 y 제외한 문자 의미
◦
“[0123]” - 지정된 숫자가 존재하는 것 반환 ( 0, 1, 2, 혹은 3)
◦
“[0-9]” - 0에서 9 사이 숫자 중 일치하는 것 반환
◦
“[0-5][0-9]” 00에서 59까지 두개 숫자중 일치하는 것을 반환
◦
“[a-zA-Z]” : a에서 z까지 알파벳 순서로 소분자 또는 대문자 중 일치하는 것 반환
◦
집합에서 +, *, ., |, (), $, {}는 특별한 의미를 갖지 않는다. 따라서 [+]는 문자열에 있는 + 문자에 대해 일치하는 것을 찾는다!
•
. : 임의의 한 문자( 새로운 줄 문자 제외 ) “he..o” - he로 시작하고 o로 끝나는 5자리 문자열
•
^ : 문자열의 시작 “^x” - x문자로 시작된다
•
$ : 문자열의 종료 “x$” - x문자로 종료됨
•
* : 0개 이상 발생. 반복여부를 표현. “x*” - x문자가 0번 이상 반복된다를 의미. 있다.
•
+ : 1개 이상 발생. 반복 여부를 표현. “x+” - x문자가 한번 이상 반복됨
•
? : 존재 여부를 표현. x문자가 존재할 수도, 존재하지 않을 수도 있음을 의미.
•
| : or를 표현 “x|y”-x 혹은 y문자가 존재함을 의미
•
{} : 지정될 수 만큼 발생.
◦
“x{n}” - x문자가 n번 반복된다.
◦
“x{n,}” - x문자가 n번 이상 반복된다.
◦
“x{n, m}” - 반복을 표현하며 x문자가 최소 n번 이상 최대 m번 이하 반복
•
() : 그룹. “(x)” - x를 그룹으로 처리함
◦
(x)(y) - 그룹들의 집합. 앞에서부터 순서대로 번호 부여해 관리하고 x, y는 각 그룹의 데이터로 관리된다
◦
(x)(?:y) - 그룹들의 집합에 대한 예외 표현. 그룹집합으로 관리되지 않음을 의미.
\ + 문자 하나로 특별한 의미를 갖는 문자열들
•
\^ : escape. ^를 문자로 사용함
•
\b : word boundary. 문자와 공백 사이의 문자 의미.
•
\B : non word boundary. 문자
•
\d : digit. 숫자 의미. 문자열이 0-9의 숫자인 것을 반환
•
\D : non digit. 숫자가 아닌 것을 의미. 문자열이 숫자를 포함하지 않는 것을 반환
•
\s : space . 공백문자. 문자열이 공백 하나를 포함하는 것을 반환
•
\S : non space. 공백문자가 아닌 것을 반환. 문자열이 공백 하나를 포함하지 않는 것을 반환
•
\t : tab. 탭 문자를 찾음
•
\v : vertical tab. 수직 탭 문자 찾음
•
\w : word. 알파멧 + 숫자 + _ 중 한 문자임을 의미
•
\W : non word. 알파벳 + 숫자 + _ 가 아닌 문자임을 의미
•
\A : 지정된 문자들이 문자열의 처음에 오는 것 반환 “\AThe”- The로 시작하는 문자열
•
\Z : 특정한 문자들이 문자열의 끝에 오는 것 반환 “Machine\Z” - Machine으로 끝나는 문자열
•
\0 : NULL 문자 찾음
•
\n : 줄바꿈 문자 찾읍
•
\f : 폼 피드 문자 찾음
•
\r : 캐리지 리턴 문자 찾음
•
\xxx : 8진수 xxx로 명시된 문자 찾음
•
\xdd : 16진수 dd로 명시된 문자 찾음
•
\uxxxx : 16진수 xxxx로 명시된 유니코드 문자를 찾음
예시
import re
def solution(new_id):
answer = ''
# 1단계 & 2단계 : 소문자 치환
answer = re.sub('[^a-z\d\-\_\.]', '', new_id.lower()) # 소문자 a-z, digit(\d), _, -, .(\_ \- \.)이 아닌 것들은 ''로 대체. new_id.lower()을 input으로 넣어준다.
# 3단계 : 마침표 2번 이상 > 하나로
answer = re.sub('\.\.+', '.', answer) # +는 최소 1번 이상 반복될 때 사용된다. *는 반복 횟수가 0부터라는 것이 차이점이다. '.'+'.'1번이상 반복을 '.'로 대체
# 4단계 : 양 끝 마침표 제거
answer = re.sub('^\.|\.$', '', answer) # ^:문자열의 시작 "^\.": 처음에 .로 시작,
# $: 문자열의 종료. "\.$" : .로 종료, |:or
# 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:] # answer[-1]은 요소이고, answer[-1:]은 list
return answer
Python
복사