<python> 정규 표현식

jm_yoon·2021년 1월 7일
1

westagram 회원가입 뷰를 작성할 때 이메일에 필요한 형식이 들어가야한다. 그래서 처음에는 if ('@' not in email or '.' not in email) 을 써서 '@' 나 '.'이 없으면 에러가 발생하도록 작성했지만..!
내가 쓴 코드는 apple.123@banana도 이메일 형식으로 인식하게된다.
이것을 방지하기 위해 사용하는 것이 정규 표현식이다.

메타문자

메타문자란 원래 그 문자 뜻이 아닌 특별한 용도로 사용하는 문자를 말한다.
. ^ $ * + ? { } [ ] \ | ( )

문자 클래스 [ ]

문자 클래스로 만들어진 정규식은 [ ] 사이의 문자들과 매치 라는 의미를 갖는다. 예를 들어 정규표현식이 [abc]라면 "a, b, c 중 한 개의 문자와 매치"를 뜻한다.

[ ]안에서 두문자 사이에 하이픈(-)을 사용하면 두 문자의 범위를 의미한다. 예를 들어 [a-z]라면 a부터 z까지 중 매치를 의미한다.

  • [a-zA-Z] : 알파벳 모두
  • [0-9] : 숫자모두

문자클래스 []안에는 어떤 문자나 메타 문자도 올 수 있지만 안에 ^ 메타문자를 사용할 경우에는 반대(not)라는 의미를 갖는다.
예를 들어 [^0-9]라는 정규표현식은 숫자가 아닌 문자만 매치된다.

Dot(.)

정규 표현식의 Dot(.) 메타 문자는 줄바꿈 문자인 \n을 제외한 모든 문자와 매치됨을 의미한다.

ex) a.b
위 정규식의 의미는 "a + 모든문자+ b"를 의미한다.
"aab"와 "a0b"는 위 정규식과 매치되지만 "abc"는 a와 b사이에 문자가 없으므로 위 정규식과 매치되지 않는다.

ex) a[.]b
이 정규식은 "a + Dot(.)문자 + b"를 의미한다.
"aab"는 매치되지만 "a0b"는 매치되지 않는다.

반복(*, +, { })

*은 *앞에 문자가 0부터 무한대로 반복될 수 있다는 의미

  • ex)ca*t이면 "cat", "caat", "caaat"모두 매치

+ 반복횟수 1번 부터를 의미

  • ex) ca+t이면 "cat"는 a가 1번이상 반복되지 않았기 때문에 매치X, "caat", "caaat"는 매치

{m, n} 반복횟수를 고정할 수 있다.

  • ex) {1,} 반복횟수 1 이상, {,3}반복회수 3 이하, {n}반드시 n번 반복, {m, n} n~m회 반복

?

?가 의미하는 것은 {0,1} 이다.

  • ex) 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 모듈

파이썬에서 정규표현식을 지원하기 위해 re(regular expression) 모듈을 제공한다. re 모듈은 파이썬을 설치할 때 자동으로 설치되는 기본 라이브러리이다.

>>> import re
>>> p = re.compile('ab*')

정규식을 이용한 문자열 검색

컴파일된 패턴 객체는 다음과 같은 4가지 메서드를 제공한다.

  • match() : 문자열의 처음부터 정규식과 매치되는지 조사한다.
  • search() : 문자열 전체를 검색하여 정규식과 매치되는지 조사한다.
  • findall() : 정규식과 매치되는 모든 문자열을 리스트로 돌려준다.
  • finditer() : 정규식과 매치되는 모든 문자열을 반복 가능한 객체로 돌려준다.

이메일 정규식

^[a-zA-Z0-9+-_.]+@[a-zA-Z0-9-]+.[a-zA-Z0-9-.]+$

참고

정규 표현식 살펴보기

profile
Hello!

0개의 댓글