2 분 소요

정규표현식

정규표현식이란 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어이다.

메타 문자

정규표현식에서 특정 문자들은 기존의 의미와 다른 특별한 의미를 갖게 된다.

주로 사용되는 메타문자 목록은 다음과 같다.

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

[ ] 문자 클래스

  • [] 사이의 문자들과 매치를 의미한다.
    • 표현식이 [abc] 일 때 a,b,c 중 하나의 알파벳이라도 문자열에 포함되어 있다면 매칭된다.
  • 하이픈을 이용하여 범위를 지정할 수 있다.
    • [abc] 는 [a-c]와 같다.
    • [a-zA-Z] = 알파벳 모두, [0-9] = 모든 숫자 를 의미한다.
  • 문자 클래스 안에 ^를 사용할 경우 반대를 의미한다.
    • [^0-9] 는 숫자가 아닌 문자를 의미한다.
  • 자주 사용하는 문자 클래스
    • \d : [0-9] 와 동일
    • \D : [ ^ 0-9] 와 동일
    • \s : whitespace 문자와 매치 [ \t\n\r\f\v] 와 동일
    • \S : \s와 반대
    • \w : 문자 +숫자와 매치 [a-zA-Z0-9_] 와 동일
    • \W : \w 와 반대
    • [ㄱ-힣] : 모든 한글을 의미한다

Dot

  • 줄바꿈 문자를 제외한 모든 문자와 매칭된다.
    • a.b 이라는 정규식을 사용할 경우 a + 모든문자 + b 를 의미한다.
    • 즉 ab 사이에 줄바꿈문자외에 어떤문자라도 존재한다면 매칭된다.

반복 (*)

  • 0번부터 무한대로 반복될 수 있음을 의미한다.

    • do*g 일 경우 doooog dog dg 모두 매칭된다.

반복(+)

  • 1번부터 무한대로 반복될 수 있음을 의미한다.
    • do*g 일 경우 doooog dog dg 에서 1번도 o가 반복되지 않는 dg를 빼고 모두 매칭된다.

반복 {m,n}

  • 반복횟수를 지정 가능하다.
    • do{2}g 일 경우 doog 와 매칭된다.
    • do{2,5}g 일 경우 doog, dooog doooog dooooog 까지 매칭된다.

?

  • {0,1} 과 같다.
    • 있어도 되고 없어도 된다를 의미함.
    • do?g 일 경우 dog , dg 모두 매칭 된다.

python 에서의 정규표현식

파이썬에서는 정규표현식을 사용하기 위해 re모듈을 기본 라이브러리로 제공한다.

re.complie

re.compile 함수를 사용하여 정규식을 컴파일하여 객체를 반환한다.

해당 객체를 통해 문자열 검색이 가능하다.

import re

p= re.compile('[a-z]+') #모든 소문자 알파벳이 한 번 이상 반복될 수 있음을 의미

match

매치 함수를 통해 정규식과 매칭 여부를 알 수있다.

m = p.match('yoonjungho')
print(m)
<re.Match object; span=(0, 10), match='yoonjungho'>
m = p.match('yoon7jungho')
print(m)
<re.Match object; span=(0, 4), match='yoon'>
m = p.match('7 yoonjungho')
print(m)
None

보이는 것과 같이 매칭여부를 반환해준다.

match 인스턴스 함수

  • group() : 매칭된 문자열을 반환
  • start() : 매칭된 문자열의 시작 위치를 반환
  • end() : 매칭된 문자열의 끝 위치를 반환
  • span() : 매칭된 문자열의 시작과 끝에 해당하느 튜플을 반환
import re

p= re.compile('[a-z]+')

m = p.match('yoon7jungho')
print(m)


print(m.group())
print(m.start())
print(m.end())
print(m.span())
<re.Match object; span=(0, 4), match='yoon'>
yoon
0
4
(0, 4)

그룹함수는 매칭 결과를 좀 더 보기좋게 식별하기 위해 사용된다.

import re

p= re.compile('[a-z]+')

m = p.match('yoon7jungho')
if m:
    print('Match found: ', m.group())
else:
    print('No match')
Match found:  yoon

match 와 다르게 해당 문자열의 첫번째부터가 아닌 전체를 검색한다.

import re

p= re.compile('[a-z]+')

m = p.search('7 yoon7jungho')

print(m)
<re.Match object; span=(2, 6), match='yoon'>

findall

매칭되는 문자열을 리스트의 형태로 반환한다.

import re

p= re.compile('[a-z]+')

m = p.findall('jungho is awesome')

print(m)
['jungho', 'is', 'awesome']

finditer

반복가능한 이터레이터 객체 형식으로 결과를 반환한다.

import re

p= re.compile('[a-z]+')

m = p.finditer('jungho is awesome')

for x in m :
    print(x)

<re.Match object; span=(0, 6), match='jungho'>
<re.Match object; span=(7, 9), match='is'>
<re.Match object; span=(10, 17), match='awesome'>

번외, 좋은 블로그 정리글

티스토리 하마님 블로그 https://hamait.tistory.com/342

댓글남기기