Dev

정규표현식 시작하기

SambaLim 2019. 1. 16. 23:59
정규표현식 시작하기

사용해보기

REPL 사용하기

http://repl.it/ 접속

메타 문자

설명

  • . (dot) : 숫자와 문자 특수기호, 공백 등을 포괄한 모든 범위의 한 글자
  • ^ (circumflex) : 문자열의 시작점. 그러나 일반적으로는 한 줄의 시작점을 의미한다. 문자클래스 집합에서는 다른 의미를 갖는다.
  • $ (dollar) : 문자열의 끝점. 그러나 일반적으로는 한 줄의 끝점을 의미한다.
  • \ (back slash) : 메타문자를 검색하기 위하여 특수문자 앞에 사용한다. 마침표 . 를 찾기 위해 . 을 사용한다.
  • | (vertical bar) : 또는 을 의미한다. (고구려|백제|신라) 를 찾으면 고구려 또는 백제, 신라를 찾게 된다.

이스케이프 문자

설명

  • \w : 영문자와 숫자, 언더스코어 _
  • \W : 영문자와 숫자, 언더스코어가 아닌 문자
  • \d : 10진수로 된 숫자
  • \D : 10진수 숫자가 아닌 모든 문자(공백 포함)
  • \s : 탭, 줄바꿈 등 지정된 공백문자 [\t\n\r\f\v]
  • \S : 위 공백문자가 아닌 모든 글자
  • \t : 일반적으로 탭(TAB)키를 입력했을 때 나오는 일정 간격을 유지하는 공백

예시

전화번호를 찾기 위한 첫 단계는 숫자를 찾아내는 겁니다.

regex = r'\d'

search_target = '''Luke Skywarker 02-123-4567 luke@daum.net
다스베이더 070-9999-9999 darth_vader@gmail.com
princess leia 010 2454 3457 leia@gmail.com'''

import re
result = re.findall(regex, search_target)
print("\n".join(result))

예시결과

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

The r means that the string is to be treated as a raw string, which means all escape codes will be ignored.

특수 문자

  • ? : 문자가 없거나 하나인 경우
  • * : 문자가 없거나 하나 이상 존재하는 경우
  • + : 문자가 하나 이상 존재하는 경우

예시

\d는 숫자를 한글자만 찾습니다. 그런데, 전화번호를 구성하는 043이나 2568같이 연결된 숫자를 찾고 싶을 때는 어떻게 해야 할까요?

regex = r'\d+'

search_target = '''Luke Skywarker 02-123-4567 luke@daum.net
다스베이더 070-9999-9999 darth_vader@gmail.com
princess leia 010 2454 3457 leia@gmail.com'''

import re
result = re.findall(regex, search_target)
print("\n".join(result))

예시결과

그럴 땐 +를 이용하면 됩니다. +는 하나 혹은 그 이상 연결된이라는 뜻입니다. 따라서 \d+는 하나 혹은 그 이상 연결된 숫자를 의미합니다.

대괄호 : 문자 클래스의 집합

문자 클래스란 문자열, 특수문자 등을 등잘할 수 있는 형태를 표시한 것

  • [0-9] : 0부터 9까지의 숫자 집합을 의미
  • [A-Z] : 영어 대문자 집합
  • [AEIOUaeiou] : 영어에서 a,e,i,o,u로 이루어진 대소문자 집합
  • [가-힣] : 가부터 힣까지의 한글자모부분을 제외한 한글집합

대괄호 내에 ^가 들어가면 ^ 뒤에 나오는 문자 클래스는 해당 집합에서 제외한다는 의미

  • [^0-9] : 0부터 9까지의 숫자 집합을 제외한다는 의미이며, 이스케이프 문자 \D와 동일한 의미
  • [^A-Z] : 행의 앞쪽이 영어 대문자 집합인 것을 제외하고 찾으라는 의미
  • [0-9+\-*/\^\(\)=] : 숫자와 사칙연산 부호 등(+, -, *, /, ^, \=)을 찾으라는 의미

예시

정규표현식으로 010, 123, 456 중 자연수를 찾으려면 어떻게 해야 할까요?

regex = r'[1-9]\d*'
 
search_target = '''Luke Skywarker 02-123-4567 luke@daum.net
다스베이더 070-9999-9999 darth_vader@gmail.com
princess leia 010 2454 3457 leia@gmail.com'''
 
import re
result = re.findall(regex, search_target)
print("\n".join(result))

예시결과

자연수는 다음과 같이 표현할 수 있습니다.

  1. 처음에 1~9중 하나의 숫자가 나온 다음
  2. 그 뒤에는 숫자가 0개 이상 나오면

은 0개 이상이라는 뜻입니다. 따라서 \d는 숫자가 0개 이상이다를 의미합니다. 이를 이용하면 자연수는 [1-9]\d*로 표현할 수 있습니다.

중괄호 : 수량자

수량자 앞의 글자 혹은 문자클래스 집합의 글자수가 얼마나 되는지를 지정하는 것

  • [0-9]{5} : 5자리의 숫자 집합
  • [A-Za-Z]{3,} : 3글자 이상의 영어 단어 집합
  • [A-Za-z0-9]{4,8} : 4글자 이상 8글자 이하의 영어 대소문자와 숫자로 이루어진 집합

수랑자 & 특수문자

  • ? : {0,1} 문자가 없거나 하나인 경우
  • * : {0,} 문자가 없거나 하나 이상 존재하는 경우
  • + : {1,} 문자가 하나 이상 존재하는 경우

게으른 수량자 ?

  • .+ : 한 줄을 의미
  • .+? : .와 동일한 결과를 가져온다.
  • .{3,} : 3글자 이상의 한 줄
  • .{3,}? : 한 줄을 3글자 단위로 끊은 결과를 보여준다.

소괄호 : 그룹

  • 충청(남|북)?도 : 충청남도, 충청북도, 충청도를 의미

Flag

  • g : (Global) 문자열 내의 모든패턴을 찾는다.
  • i : (Ignore Case) 문자의 대소문자를 구별하지 않음
  • m : (multi Line) 문자열이 행이 바뀌어도 찾는다.

풀어보기

문제 1

Luke와 다스베이더의 전화번호 찾기

답변 1

?는 '있거나 없거나'라는 뜻입니다. 따라서 -?는 -가 있거나 없다를 의미합니다. 따라서 이를 연속하는 숫자는 \d+와 조합하면 전화번호를 찾는 정규표현식을 만들 수 있습니다. \d+-?\d+-?\d+

답변 2

\d{2,3}[- ]?\d{3,4}[- ]?\d{4}


http://www.nextree.co.kr/p4327/ https://programmers.co.kr/learn/courses/11/

'Dev' 카테고리의 다른 글

2019년도 높은 연봉을 받는 15가지 IT 자격증  (0) 2019.02.17
JDK 유료화 이슈 OpenJDK 링크  (0) 2019.01.26
ShareX 사용법  (0) 2019.01.21
Typora 시작하기  (0) 2019.01.18
정규표현식이란?  (0) 2019.01.16