정규표현식

By | 2024년 6월 27일
Table of Contents

정규표현식

참조

정규표현식은 언어마다 비슷하면서도 다른 부분이 많습니다.
아래에서는 대체적으로 공통적인 부분을 정리해 놓습니다.

하지만 실제 사용하기 전에는 java regex 와 같이 특정 언어에서는 어떻게 정규식이 쓰이고 있는지 확인해야 합니다.

온라인 파이선 실행

https://www.online-python.com/

기본 문법

Meta char 사용법 의미
^ ^x 문자열의 시작을 표현하며 x 문자로 시작됨을 의미한다.
$ x$ 문자열의 종료를 표현하며 x 문자로 끝을 의미한다.
* x* 반복여부를 표현하며 x 문자가 0번 또는 그 이상 반복됨을 의미한다.
. .x 임의의 한 문자의 자리수를 표현하며 문자열이 x 로 끝난다는 것을 의미한다.
+ x+ 반복을 표현하며 x 문자가 한번 이상 반복됨을 의미한다.
? x? 존재여부를 표현하며 x 문자가 존재할 수도, 존재하지 않을 수도 있음을 의미한다.
| x|y or 를 표현하며 x 또는 y 문자가 존재함을 의미한다.
() (x) 그룹을 표현하며 x 를 그룹으로 처리함을 의미한다.
{n} x{n} 반복을 표현하며 x 문자가 n번 반복됨을 의미한다.
{n,} x{n,} 반복을 표현하며 x 문자가 n번 이상 반복됨을 의미한다.
{n,m} x{n,m} 반복을 표현하며 x 문자가 최소 n번 이상 최대 m 번 이하로 반복됨을 의미한다.

샘플

^ 가 매칭되는 문장의 시작을 말합니다.
$ 가 매칭되는 문장의 끝을 의미합니다.
.* 는 임의의 한개의 문자가 0 번 이상(없어도 매칭되고, 1개 이상도 매칭) 있는 것을 의미합니다.

import re

txt = "The rain in Spain"
x = re.search("^The.*Spain$", txt)

if x:
  print("match!")
else:
  print("No match")

-?- 가 있거나 없거나 매칭됩니다.
1+1 이 한개 이상 있으면 매칭됩니다.

import re

txt = "010-1112222"
# 010-111-2222
x = re.search("^010-?1+-?2+$", txt)

if x:
  print("match!")
else:
  print("No match")

\. 의 형식으로 . 이 임의의 문자가 아니라 실제 . (dot char) 하고만 매칭되도록 변경합니다.
(com|co\.kr) 의 형식으로 문자열을 하나의 세트로 묶을 수 있습니다.
com or co.kr 이라는 의미가 됩니다.

import re

txt = "google.com"
# google.com, google.co.kr
x = re.search("google\.(com|co\.kr)", txt)

if x:
  print("match!")
else:
  print("No match")

(-1+) 가 2개 일때만 매칭됩니다.

import re

txt = "010-111-1111"
# 010-111-1111
x = re.search("010(-1+){2}", txt)

if x:
  print("match!")
else:
  print("No match")

[] 사용법

정규식 의미
[xy] 문자 선택을 표현하며 x 와 y 중에 하나를 의미한다.
[^xy] not 을 표현하며  x 및 y 를 제외한 문자를 의미한다.
[x-z] range를 표현하며 x ~ z 사이의 문자를 의미한다.

샘플

특정 문자만 나열할 수 있습니다.

import re

txt = "hello"
x = re.search("^[helo]+$", txt)

if x:
  print("match!")
else:
  print("No match")

특정 문자만 제외할 수 있습니다.

import re

txt = "hello"
# hello
x = re.search("^[^a-d]+$", txt)

if x:
  print("match!")
else:
  print("No match")

[0-9] 와 같이 모든 숫자에 매칭하게 할 수 있습니다.

import re

txt = "010-12345678"
# 010-12345678
x = re.search("^010-?[0-9]+-?[0-9]+$", txt)

if x:
  print("match!")
else:
  print("No match")

숫자, 대문자, 소문자, 밑줄문자, 하이픈(-) 를 모두 매칭할 수 있습니다.
주의할 것은 하이픈(-) 은 무조건 맨 마지막에 나열되어야 합니다.

import re

txt = "my-mail_test@gmail.co.kr"
# my-mail_test@gmail.co.kr
x = re.search("^[0-9a-zA-Z_-]+@[0-9a-zA-Z_-]+(\.[a-zA-Z]+)+$", txt)

if x:
  print("match!")
else:
  print("No match")

이스케이프

위에서 사용되고 있는 특수문자 자체를 검색하고자 할 때가 있습니다.
아래처럼 특수문자 앞에 \ 를 붙여서 특수문자로 작동하지 않고 일반문자로 인식되게 할 수 있습니다.

import re

txt = "Hello, World?"
# Hello, World?
x = re.search("^[0-9a-zA-Z_, \?-]+$", txt)

if x:
  print("match!")
else:
  print("No match")

코맨트 추가해 놓기

정규식은 조금만 길어져도 해석하기 대단히 힘들고,
본인이 작성해 놓고도 1주일만 지나면 기능을 확인하기 위해,
상당한 시간을 들여 해석해야 하는 경우가 많습니다.

본인을 위해서건 다른사람을 위해서건 항상
코맨트를 붙여놓아 매번 해석해야 하는 시간을 아낄 수 있습니다.

코맨트는 입력하려는 변수를 적어놓는 것이 가장 무난합니다.

답글 남기기