본문 바로가기

Python

[Python] 정규표현식

메타 문자

메타 문자란 원래 그 문자가 가진 뜻이 아닌 특별한 용도로 사용하는 문자를 말한다.

. ^ $ * + ? { } [ ] \ | ( )

정규 표현식에 위 메타 문자를 사용하면 특별한 의미를 갖게 된다.

문자 클래스 [ ]

문자 클래스로 만들어진 정규식은 "[ ] 사이의 문자들과 매치"라는 의미를 갖는다.

문자 클래스를 만드는 메타 문자인 [ ] 사이에는 어떤 문자도들어갈 수 있다.

예를 들어 정규 표현식이 [abc]라면 이 표현식의 의미는 "a, b, c 중 한 개의 문자와 매치"를 뜻한다.

"a" -> 정규식과 일치하는 문자인 "a"가 있으므로 매치

"before" -> 정규식과 일치하는 문자인 "b"가 있으므로 매치

"dude" -> 정규식과 일치하는 문자인 "a". "b", "c" 중 어느 하나도 포함하고 있지 않으므로 매치되지 않는다.

 

[ ] 안의 두 문자 사이에 하이픈(-)을 사용하면 두 문자 사이의 범위(From - To)를 의미한다. 

예를 들어 [a-c]라는 정규 표현식은 [abc]와 동일하고 [0-5]는 [012345]와 동일하다.

[a-zA-Z] : 알파벳 모두

[0-9] : 숫자

[가-힣] : 한글 모두 (한글의 첫번째 글자는 이고 마지막 글자는 이다)

 

문자 클래스([ ]) 안에는 어떤 문자나 메타 문자도 사용할 수 있지만 주의해야 할 메타 문자가 1가지 있다. 그것은 바로 ^인데, 문자 클래스 안에 ^메타 문자를 사용할 경우에는 반대(not)라는 의미를 갖는다. 

숫자 대표문자 \d

\d는 숫자를 대표하는 정규표현식이다. 이때 d는 digit을 뜻한다.

글자 대표문자 \w

\w는 글자를 대표햐는 정규표현식이다.

\w는 

  • a, b, c, 가, 나, 다, 1, 2 와 같은 문자와 숫자를 포함한다.
  • 특수문자는 포함하지 않지만 _(언더스코어)는 포함한다.

하나 이상 +

\d는 숫자를 한글자만 찾는다. 

043이나 2568같이 연결된 숫자를 찾고 싶을 때는 +를 이용하면 된다.

+는 "하나 혹은 그 이상 연결된"이라는 뜻이다.

따라서 "\d+"는 "하나 혹은 그 이상 연결된 숫자"를 의미한다.

0개 이상 *

*는 "0개 이상"이라는 뜻이다.

따라서 \d*는 "숫자가 0개이상이다"를 의미한다.

이를 이용하면 자연수는 [1-9]\d*로 표현할 수 있다.

있거나 없거나 ?

?는 "있거나 없거나"라는 뜻이다.

따라서 -?는 "-가 있거나 없다"를 의미한다.

이를 연속하는 숫자는 \d+와 조합하면 전화번호를 찾는 정규표현식(\d+-?\d+-\d+)을 만들 수 있다.

n번

{숫자}는 "숫자번 반복한다"는 뜻이다.

예를 들어 \d{2}는 "숫자가 연속 두번 나온다"를 의미한다.

n~m번

{숫자1, 숫자2}는 "숫자1부터 숫자2까지 반복한다"는 뜻이다.

예를 들어, \w{2,3}는 "문자가 2~3번 나온다"를 의미한다.

기타 대표문자

\s : 공백문자(스페이스, 탭, 뉴라인)

\S : 공백 문자를 제외한 문자

\D : 숫자를 제외한 문자

\W : 글자 대표 문자를 제외한 글자들(특수문자, 공백 등)

그룹 ( )

정규 표현식에서 ( ) 괄호그룹을 의미한다.

import re
p = re.compile('(\d+)([SDT])([*#]?)')

findall()

findall()은 정규식과 매치되는 모든 문자열을 리스트형식으로 리턴한다.

dart = p.findall(dartResult)

 

 

참고: programmers.co.kr/learn/courses/11