정규표현식 RegEx 는 강력하다. 아주 복잡한 코드를 매우 간단하게 바꿀 수 있는 정규표현식은 다양한 분야에서 사용된다.
인스타그램 클론을 하는 중에 이메일과 비밀번호를 validate 하는 작업이 필요해서, 정규표현식을 사용해보기로 했다.
정규표현식 문법은 봐도봐도 헷갈리고 익숙해져야 하기 때문에 우선 email 을 RegEx 로 검증하면서 사용하는 표현식부터 익혀보기로 했다.
p_email = re.compile(r'^[a-zA-Z0-9+-_.]+@[a-zA-Z0-9_-]+\.[a-zA-Z-.]+$')
자신이 만든 기준 표현식을 compile
해준 뒤으로match
또는 search
로 어떤 값이 기준 표현식에 맞는지 아닌지 검증하는 방식이다.
우선 처음부터 보자.
compile
뒤 string 앞에 r 을 붙여줘서 다음 string 이 정규표현식이라는 것을 알려준다.^[a-zA-Z0-9+-_.]+
1. ^[]
: 괄호안의 표현식이 비교대상과 처음 시작하는 부분부터 일치한다는 의미
2. a-z
: 소문자
3. A-Z
: 대문자
4. 0-9
: 0부터 9까지의 숫자
5. +-_.
: +
부터 _
까지 일치시키고 .
도 일치시킨다는 의미이다.
6. +
: +
전에 나오는 문자가 최소 1개 이상이어야 한다는 의미
7. *
: 이건 예시에 없지만 +
와 비교했을 때 +
는 앞에 나오는 문자가 최소 1개여야 하지만, *
는 0개부터이다. 즉 오든 말든 다 일치시킨다는 뜻이다.
그래서 앞 부분을 해석하면,
@gmail.com
은 안되고 a@gmail.com
처럼 최소 계정명이 1개 이상이어야 한다.
이제 뒷 부분을 확인해보자.
@[a-zA-Z0-9_]+\.[a-zA-Z-.]+$
1. @
: @
과 매칭해야한다는 뜻이다. 즉 @
이 꼭 와줘야 한다.
2. [a-zA-Z0-9_-]+
: @ 뒤부터 최소 1개의 문자가 블럭 안의 표현식과 매칭해야 한다는 의미이다.
3. \.
: 문자.
을 나타내기 위해 \
백슬래시를 사용한다. 그냥 .
을 적으면 모든 문자열을 매칭하기때문에 구분해서 사용해줘야 한다.
4. [a-zA-Z-.]+$
: $
때문에 블럭안의 표현식과 비교하려는 대상이 꼭 마지막에 매칭돼야 한다.
다음은 이메일 매칭 결과이다.
패스워드는 좀 더 복잡하기 때문에 나중에 블로깅 할 예정이다.
그래도 임시방편으로 아주 간단하게 우선 8 자 이상인 문자열만 매칭시키려고 했다.
len 을 써서 할 수도 있지만 우선 정규표현식을 공부해보기 위해 작성해보았다.
8자리 이상 45자리 이하인 문자열은
.{8,45}
이렇게 표현하면 된다.
1. .
: 모든 문자열과의 매칭을 의미하고
2. {m, n}
: 앞 표현식의 m 이상 n 이하의 반복을 의미한다.