본문으로 바로가기

[Python] 정규표현식(Regular Expression)

category Language/Python 2020. 1. 5. 03:22

알아두면 유용한 정규표현식 기록합니다✍️


1. 정규표현식이란?

정규표현식(正規表現式, Regular Expression)은 문자열을 처리하는 방법 중의 하나로 특정한 조건의 문자를 '검색'하거나 '치환'하는 과정을 매우 간편하게 처리 할 수 있도록 하는 수단이다.

2. 메타 문자

더보기

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

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

1) 문자 클래스 [ ]

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

 

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

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

  • [0-9] : 숫자

별도 표기법

  • \d - 숫자와 매치, [0-9]와 동일한 표현식이다.

  • \D - 숫자가 아닌 것과 매치, [^0-9]와 동일한 표현식이다.

  • \s - whitespace 문자와 매치, [ \t\n\r\f\v]와 동일한 표현식이다. 맨 앞의 빈 칸은 공백문자(space)를 의미한다.

  • \S - whitespace 문자가 아닌 것과 매치, [^ \t\n\r\f\v]와 동일한 표현식이다.

  • \w - 문자+숫자(alphanumeric)와 매치, [a-zA-Z0-9_]와 동일한 표현식이다.

  • \W - 문자+숫자(alphanumeric)가 아닌 문자와 매치, [^a-zA-Z0-9_]와 동일한 표현식이다.

2) Dot(.)

Dot(.) 메타 문자는 줄바꿈 문자인 \n을 제외한 모든 문자와 매치됨을 의미한다.

 

예시)

a.b -> "a + 모든문자 + b"

a와 b라는 문자 사이에 어떤 문자가 들어가도 모두 매치된다는 의미

 

3) 반복

① *

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

(메모리 제한으로 2억 개 정도만 가능하나 무한이라고 표기)

 

② +

+는 최소 1번 이상 반복될 때 사용

 

③ {m, n}

반복 횟수를 고정할 때 사용하며 반복 횟수를 m부터 n까지 매치 가능

m 또는 n은 생략이 가능함 (생략된 m은 0, n은 무한대의 의미와 동일)

 {1,} +와 동일하고, {0,} *와 동일하다.

 

④ ?

{0,1}을 의미

바로 앞의 문자가 있어도 되고 없어도 된다는 의미

3. 파이썬에서 사용, re모듈

파이썬은 정규 표현식을 지원하기 위해 re(regular expression의 약어)모듈을 제공한다.

파이썬을 설치할 때 자동으로 설치되는 기본 라이브러리이다.

import re
p = re.compile('ab*')

re.compile을 사용하여 정규 표현식(위 예에서는 ab*)을 컴파일한다.

re.compile의 결과로 돌려주는 객체 p(컴파일된 패턴 객체)를 사용하여 그 이후의 작업을 수행할 것이다.

※ 패턴이란 정규식을 컴파일한 결과이다.

4. 문자열 검색

컴파일된 패턴 객체는 다음과 같은 4가지 메서드를 제공

Method 목적
match() 문자열의 처음부터 정규식과 매치되는지 조사한다.
search() 문자열 전체를 검색하여 정규식과 매치되는지 조사한다.
findall() 정규식과 매치되는 모든 문자열(substring)을 리스트로 돌려준다.
finditer() 정규식과 매치되는 모든 문자열(substring)을 반복 가능한 객체로 돌려준다.
(반복 가능한 객체가 포함하는 각각의 요소는 match 객체)

match, search는 정규식과 매치될 때는 match 객체를 돌려주고, 매치되지 않을 때는 None을 돌려준다

 

match로 간단한 예시)

import re
p = re.compile('[a-z]+')
m = p.match("3 python")
print(m)

3이 문자열 처음에 나와 정규식에 부합되지 않으므로 None을 반환할 것이다.

만약에 부합된다면 match 객체를 반환한다.

5. match 객체의 메서드

Method 목적
group() 매치된 문자열을 돌려준다.
start() 매치된 문자열의 시작 위치를 돌려준다
end() 매치된 문자열의 끝 위치를 돌려준다.
span() 매치된 문자열의 (시작, 끝)에 해당하는 튜플을 돌려준다.

6. 모듈 단위 수행, 축약형

지금까지 우리는 re.compile을 사용하여 컴파일된 패턴 객체로 그 이후의 작업을 수행했다.

re 모듈은 이것을 좀 축약한 형태로 사용할 수 있는 방법을 제공한다.

p = re.compile('[a-z]+')
m = p.match("python")

위 코드가 축약된 형태는 다음과 같다.

m = re.match('[a-z]+', "python")

위 예처럼 사용하면 컴파일과 match 메서드를 한 번에 수행할 수 있다.

보통 한 번 만든 패턴 객체를 여러번 사용해야 할 때는 이 방법보다 re.compile을 사용하는 것이 편하다.

7. 컴파일 옵션

정규식을 컴파일할 때 다음 옵션을 사용할 수 있다.

  • DOTALL(S) - . 이 줄바꿈 문자를 포함하여 모든 문자와 매치할 수 있도록 한다.

  • IGNORECASE(I) - 대소문자에 관계없이 매치할 수 있도록 한다.

  • MULTILINE(M) - 여러줄과 매치할 수 있도록 한다.
    (^, $ 메타문자의 사용과 관계가 있는 옵션이다
    ^는 문자열의 처음을 의미하고, $는 문자열의 마지막을 의미)

  • VERBOSE(X) - verbose 모드를 사용할 수 있도록 한다.

    (정규식을 보기 편하게 만들수 있고 주석등을 사용할 수 있게된다.)

옵션을 사용할 때는 re.DOTALL처럼 전체 옵션 이름을 써도 되고 re.S처럼 약어를 써도 된다.

 

DOTALL을 활용한 예시)

p = re.compile('a.b', re.DOTALL)
m = p.match('a\nb')
print(m)

 

참고: 점프 투 파이썬

 

위키독스

온라인 책을 제작 공유하는 플랫폼 서비스

wikidocs.net