westagram 회원가입 뷰를 작성할 때 이메일에 필요한 형식이 들어가야한다. 그래서 처음에는 if ('@' not in email or '.' not in email)
을 써서 '@' 나 '.'
이 없으면 에러가 발생하도록 작성했지만..!
내가 쓴 코드는 apple.123@banana
도 이메일 형식으로 인식하게된다.
이것을 방지하기 위해 사용하는 것이 정규 표현식이다.
메타문자란 원래 그 문자 뜻이 아닌 특별한 용도로 사용하는 문자를 말한다.
. ^ $ * + ? { } [ ] \ | ( )
문자 클래스로 만들어진 정규식은 [ ] 사이의 문자들과 매치
라는 의미를 갖는다. 예를 들어 정규표현식이 [abc]
라면 "a, b, c 중 한 개의 문자와 매치"
를 뜻한다.
[ ]안에서 두문자 사이에 하이픈(-)을 사용하면 두 문자의 범위를 의미한다. 예를 들어 [a-z]
라면 a부터 z까지 중 매치를 의미한다.
문자클래스 []안에는 어떤 문자나 메타 문자도 올 수 있지만 안에 ^ 메타문자
를 사용할 경우에는 반대(not)라는 의미를 갖는다.
예를 들어 [^0-9]
라는 정규표현식은 숫자가 아닌 문자만 매치된다.
정규 표현식의 Dot(.) 메타 문자는 줄바꿈 문자인 \n
을 제외한 모든 문자와 매치됨을 의미한다.
ex) a.b
위 정규식의 의미는 "a + 모든문자+ b"
를 의미한다.
"aab"와 "a0b"는 위 정규식과 매치되지만 "abc"는 a와 b사이에 문자가 없으므로 위 정규식과 매치되지 않는다.
ex) a[.]b
이 정규식은 "a + Dot(.)문자 + b"
를 의미한다.
"aab"는 매치되지만 "a0b"는 매치되지 않는다.
*
은 *앞에 문자가 0부터 무한대로 반복될 수 있다는 의미
ca*t
이면 "cat", "caat", "caaat"모두 매치+
반복횟수 1번 부터를 의미
ca+t
이면 "cat"는 a가 1번이상 반복되지 않았기 때문에 매치X, "caat", "caaat"는 매치{m, n}
반복횟수를 고정할 수 있다.
{1,}
반복횟수 1 이상, {,3}
반복회수 3 이하, {n}
반드시 n번 반복, {m, n}
n~m회 반복?
가 의미하는 것은 {0,1}
이다.
ab?c
는 "a + b(있어도 되고 없어도 된다) +c"
를 의미한다.| 메타문자
는 or과 동일한 의미로 사용된다.
A|B
라는 정규식이 있다면 A또는 B라는 의미가 된다.
^ 메타문자
는 문자열의 맨 처음과 일치함을 의미한다.
>>> print(re.search('^Life', 'Life is too short'))
<re.Match object; span=(0, 4), match='Life'>
>>> print(re.search('^Life', 'My Life'))
None
^Life
정규식은 Life 문자열이 처음에 온 경우에는 매치하지만 처음 위치가 아닌 경우에는 매치되지 않음을 알 수 있다.
$ 메타문자
는 ^
와 반대개념, 문자열의 끝과 매치함을 의미한다.
^
또는$
문자를 메타문자가 아닌 문자 그 자체로 매치하고 싶은 경우에는\^
,\$
로 사용하면 된다.
파이썬에서 정규표현식을 지원하기 위해 re(regular expression) 모듈을 제공한다. re 모듈은 파이썬을 설치할 때 자동으로 설치되는 기본 라이브러리이다.
>>> import re
>>> p = re.compile('ab*')
컴파일된 패턴 객체는 다음과 같은 4가지 메서드를 제공한다.
^[a-zA-Z0-9+-_.]+@[a-zA-Z0-9-]+.[a-zA-Z0-9-.]+$