프로그래밍/python

파이썬 정규표현식 기초

콘파냐 2017. 3. 21. 17:00
반응형
정규표현식, 쉽게 말해서 문자집합의 패턴이 일치하는지 검사하기 위해서 사용하는 표현이다. 패턴이라 하면 구체적인 단어가 아니라 예를들어 "알파벳으로 시작하는 4문자로 이루어진 단어" 또는 "문자로 시작하되 숫자로 끝나는 문자집합" 같은 표현이다. 이런 패턴을 표현한 식이 정규식, 즉 정규 표현식이다. 정규표현식의 쓰임새는 문자를 다루는 프로그램에서는 매우 광범위 하기 때문에(전화번호 찾기, 성이 kim인 사람 찾기, 숫자가 포함된 단어 제외하기) 대부분의 언어에서 정규표현식을 위한 라이브러리가 존재한다. 파이썬 역시 re라는 모듈을 import 하면 쉽게 정규 표현식을 사용하여 패턴을 검사할 수 있다.

왜 사용해야하나?
물론 프로그램 마다 검색할 패턴은 정해져 있기 때문에 특정 패턴에대한 검사를 하는 함수를 직접 만들 수 있을 것이다. 하지만 프로그래밍을 조만간 그만둘 계획이 아니라면 정규 범용적으로 쓰이는 정규 표현식을 사용하는 것이 좋다.
정규표현식을 위한 라이브러리를 사용하는 방법과 정규표현식을 공부하는 것은 별개다. 따라서 정규 표현식에 대한 지식이 선행되야 하겠다. 공부 방법은 대략 어떻게 사용하는 지에 대한 내용만 익혀놓고(10분 이면 충분하다. 하지만 모든걸 알려면 오래걸린다.)  필요에 따라서 찾아서 패턴을 맞추는 방법을 익히면 되겠다. 그런 의미에서 정규 표현식이 어떻게 사용되는지 간단한 예를 들어 보겠다. 우선 파이썬 코드는 무시하자.
위 에 여러 단어를 열거해 놓았다. 각각 자신만의 특정한 패턴이 있다. 사람이 패턴을 인식하는 방법은 직관적이기 때문에 쉽게 설명할 수 없다. 그럼에도 사람은 패턴을 잘 파악한다. 컴퓨터는 사람이 정규표현식으로 패턴을 알려줘야한다.
다음은 위 단어 중에서 순수한 문자로만 이루어진 패턴을 찾는 코드다.
결과는 다음과 같다. 
apple
orange
banana
설명 : [a-z]라고 하면 a부터 z까지의 중에 하나의 알파벳을 의미한다. 즉 문자 하나를 의미한다. 뒤에 +를 붙여서 하나 이상을 나타낼 수도 있다. +는 앞에 표현한 문자의 개수가 연속적으로 1이상이 있다면 몇개가 되든 같은 패턴으로 인식한다.
findall( 패턴, 문자열) 이라고 하면 문자열에서 패턴에 맞는 문자열들을 찾아서 리스트로 반환해 준다. 여기서 반환된 문자열을 살펴보자. 사실 apple이나 orange는 apple1과 123orange의 부분 문자열이다.

부분 문자열이 아닌 순수한 알파벳으로 이루어진 문자를 찾으려면 어떻게 할까?
\b는 영문자 숫자가 아닌 문자들(공백포함)을 의미한다. 즉, \b라 하면 단어의 경계를 의미한다고 생각하면 된다. 앞에\를 한번 더 써줬는데 이유가 있다. 언어마다 확장문자열을 나타내는 표현이 있다. 그런데 보통 \b는 확장문자열 백스페이스를 나타낸다. 파이썬도 마찬가지며 이 문자를 정규표현식으로 처리하기 전에 파이썬이 먼저 백스페이스 문자로 만들어 버리기 때문에 문제가 생긴다 따라서 위와 같이 앞에 \를 하나 더 붙여 주는 것이다. 다른 방법이 있는데 다음과 같이 r"문자열" 로 표현하면 해결된다.
앞으로는 이렇게 r을 붙여주자.

이번에는 앞에 문자열에서 년도를 추출해보자. 2017-03-21의 패턴을 찾으면 된다. 정규표현식으로 다음과 같이 표현할 수 있다.
그런데 이 역시 날짜 뿐 아니라 전화번호나 기타 숫자-숫자-숫자 표현들까지 매치된다. 그래서 정확한 숫자의 개수를 명시해줄 필요가 있다.
{}안에 숫자는 앞에 문자가 반복되는 횟수를 제한한다. {2}는 2번 반복 {2,4} 2~4번 반복.. 이런식이다. 그리고 날짜 표현은 달 수와 일 수가 제한이 있으므로 다음과 같이 하면 좀 더 정확하게 표현할 수 있을 것이다.
[01]은 0이나 1이란 표현이다. 이런 식으로 여러 문자를 이어쓸 수 있다. [0-3]은 [0123]과 같은 의미다. 참고로 [0-9]를 \d로 줄여쓰기도 한다. 

이외에도 이런 표현은 다음과 같은 것들이 있다.

 특수 문자

의미 

비고 (같은의미)

\d 

숫자(양의 정수) 한개

[0-9] 

\D

\d가 아닌 문자

>[^0-9] 

\s

화이트 스페이스 문자(공백, 탭) 

[\t\n\r\f\v] 

\S

\s가 아닌 문자 

[^\t\n\r\f\v]

\w 

숫자와 문자(알파벳, 한글 등..) 

 

\W 

\w가 아닌 문자 

 

\b 

단어의 시작 전 또는 끝다음의 경계를 의미

 

\B 

\b가 아닌 곳을 의미 

 


메타문자들에는 다음과 같은 것들이 있다.

 *

0번이상 반복 

+

1번이상 반복 

있거나 없거나 

 {n}

n번 반복 

{n, k} 

n~k번 반복 

 .

모든문자

^

문자열의 시작 

$

문자열의 끝

or 

[ ] 

문자그룹표현 


위 내용은 정규식의 아주 기본적인 내용이다. 사실 아주 복잡한 것 아니면 위 내용으로 대부분 커버된다. 또한 파이썬의 라이브러리를 사용하여 정규식을 다루면 문자열에서 패턴을 검색해서 치환하는 등의 여러 작업을 쉽게 할 수 있다. 그 내용은 나중에 다시 다루기로 하겠다.

반응형