Link Search Menu Expand Document
정규표현식 (Regular Expressions)
Table of contents
  1. 정규표현식에서 사용하는 메타문자
  2. 대표문자 (Meta sequence)
    1. 숫자 대표문자
    2. 문자 대표문자
    3. 기타 대표문자
  3. 횟수 정하기 (Quantifier)
    1. 하나 이상
    2. 0개 이상
    3. 있거나 없거나
    4. n번
    5. n~m번
  4. 고르기
    1. 몇 개 중에 고르기
    2. 범위에서 고르기
  5. Ref.

정규표현식(Regular Expressions)은 복잡한 문자열을 처리할 때 사용하는 기법으로, 파이썬만의 고유 문법이 아니라 문자열을 처리하는 모든 곳에서 사용된다. 즉, 꼭 필요한 것은 아니지만 정규표현식을 알고 있다면 훨씬 더 간결하고 직관적인 코드를 작성할 수 있다.

정규표현식을 사용하기 위해서는 제일 먼저 re 모듈을 import 해야한다. re 모듈은 파이썬이 설치될 때 자동으로 설치되는 기본 라이브러리로 설치할 필요는 없다.

import re

정규표현식에서 사용하는 메타문자

. & $ * ? { } [ ] \ | ( )
  • 문자클래스 [ ]

    [ 와 ] 사이의 문자들과 매치. [ ] 사이에 하이픈(-)을 사용하면 두 문자 사이의 범위를 의미

  • Dot .

    줄바꿈 문자인 \n 을 제외한 모든 문자와 매치됨을 의미

  • 반복 *

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

  • 반복 +

    바로 앞에 있는 문자가 최소 1번 이상 반복될 때 사용

  • 반복 ?

    {0,1}을 의미 ⇒ 있거나 없거나

  • 반복 {m,n}

    { } 메타 문자를 이용하면 반복 횟수를 고정 가능

    • {m, n} m번부터 n번까지
    • {n} n번 반복
    • {m, } m번 이상 / { ,n} n번 이하를 의미
  • |

    or과 동일한 의미로 사용

  • ^

    문자열의 맨 처음과 일치함을 의미

  • &

    ^ 메타 문자와 반대의 경우로 문자열의 끝과 매치함을 의미

대표문자 (Meta sequence)

숫자 대표문자

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

문자 대표문자

  • \w는 글자를 대표하는 정규표현식
  • \wa, b, c, 가, 나, 다, 1, 2와 같은 문자와 숫자를 포함한다.
  • 특수문자는 포함하지 않지만, _(언더스코어)는 포함한다.

기타 대표문자

  • \s 공백 문자(스페이스, 탭, 뉴라인)
  • \S 공백 문자를 제외한 문자
  • \D 숫자를 제외한 문자
  • \W 글자 대표 문자를 제외한 글자들(특수문자, 공백 등)

횟수 정하기 (Quantifier)

하나 이상

  • \d\w 는 숫자나 글자 한 글자만 찾는다.
  • 이때 한 개 이상의 연결된 숫자나 글자를 찾고 싶다면 + 를 이용하면 된다.
  • +는 하나 혹은 그 이상 연결된이라는 뜻
  • \d+는 하나 혹은 그 이상 연결된 숫자를 의미

0개 이상

  • 만약 나올 수도 있고, 나오지 않을 수도 있는 경우 즉 0개 이상을 찾고 싶다면 * 를 이용하면 된다.
  • \d*는 0개 이상의 연결된 숫자를 의미
  • 이때 만약 자연수인 수를 찾고 싶다면 자연수가 0으로 시작할 수 없으므로 [1-9]\d*로 표현 가능

있거나 없거나

  • ?는 ‘있거나 없거나’라는 뜻

010-1234-5678 형태로 되어있는 전화번호를 찾는 정규표현식

  • 따라서 -?는 -가 있거나 없다를 의미
regex = r'\d+-?\d+-?\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(result)

# ['02-123-4567', '070-9999-9999', '010', '2454', '3457']

010 1234 5678처럼 공백으로 구분된 전화번호를 찾는 경우도 추가

    • 또는 (공백)이 있거나 없다는 조건은 [- ]?로 표현
regex = r'\d+[- ]?\d+[- ]?\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(result)
# ['02-123-4567', '070-9999-9999', '010 2454 3457']

n번

  • {숫자}는 숫자번 반복한다는 뜻
  • 예를 들어 \d{2}는 숫자가 연속 두 번 나온다는 뜻

n~m번

  • {숫자1, 숫자2}는 숫자1부터 숫자2까지 반복한다는 뜻
  • 예를 들어, \w{2,3}는 문자가 2 ~ 3번 나온다는 뜻

다양한 형식의 전화번호를 찾는 정규표현식

regex = r'\d{2,3}[- ]?\d{3,4}[- ]?\d{4}'

search_target = '''이상한 전화번호 0030589-5-95826
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(result)
# ['02-123-4567', '070-9999-9999', '010 2454 3457']

고르기

몇 개 중에 고르기

  • 대괄호[ ] 안에 글자를 넣으면 해당 글자를 모두 선택 가능
  • 예를 들어, 알파벳 중에 소문자 모음(a,e,i,o,u)만 고르고 싶다면 [aeiou]

범위에서 고르기

  • [범위시작-범위끝] 은 범위 시작부터 범위 끝까지를 모두 선택하라는 의미
  • 예를 들어 소문자 알파벳만 모두 고르고 싶다면 [abcdefghijklmnopqrlstuvwxyz]처럼 대괄호 안에 소문자를 모두 나열할 수도 있지만, 간단히 [a-z]를 써도 된다
  • 알파벳 모두 ⇒ [a-zA-Z]
  • 한글 단어 ⇒ [가-힣]
  • 숫자 ⇒ [0-9]
  • TIP. 연속된 영어 소문자 찾기 ⇒ [a-z]+

Ref.


Page last modified: Jan 24 2021 at 11:01 PM.