관리 메뉴

클라이언트/ 서버/ 엔지니어 " 게임 개발자"를 향한 매일의 공부일지

정규 표현식 2 - 정규 표현식 시작하기 본문

프로그래밍 언어/파이썬

정규 표현식 2 - 정규 표현식 시작하기

huenuri 2024. 10. 5. 14:01

정규 표현식에서는 메타 문자를 사용한다. 먼저 메타 문자가 무엇인지 알아보자.


 

 

 

 

정규 표현식의 기초, 메타 문자

메타 문자란 원래 그 문자가 가진 뜻이 아니라 특별한 의미를 가진 문자를 말한다. 정규 표현식에 다음과 같은 메타 문자를 사용하면 특별한 의미를 갖게 된다.

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

 

가장 간단한 정규 표현식부터 시작해 각 메타 문자의 의미와 사용법을 알아보기로 하자.


 

 

[ ] 문자 - 문자 클래스

문자 클래스로 만들어진 정규식은 [ 와 ] 사이의 문자들과 매치한다는 의미를 갖는다. 즉, 정규 표현식이 [abc]라면 이 표현식의 의미는 'a, b, c 중 한 개의 문자와 매치'를 뜻한다.

[ ] 안의 두 문자 사이에 하이픈(-)을 사용하면 두 문자 사이의 범위를 의미한다. 예를 들어 [a-c]라는 정규 표현식은 [abc]와 동일하고 [0-5]는 [012345]와 동일하다.

문자 클래스 안에는 어떤 문자나 메타 문자도 사용할 수 있지만, 주의해야 할 메타 문자가 하나 있다. 그것은 바로 ^인데, 문자 클래스 안에 ^을 사용할 경우 반대라는 의미를 갖는다. 예를 들어 [^0-9]라는 정규 표현식은 숫자가 아닌 문자에만 매치된다.

 

 

자주 사용하는 문자 클래스

 

대문자로 사용된 것은 소문자의 반대라는 것을 추측할 수 있다.


 

 

 

 

.[dot] 문자 -- \n을 제외한 모든 문자

정규 표현식의 .(dot) 메타 문자는 줄 바꿈 문자인 \n을 제외한 모든 문자와 매치된다는 것을 의미한다. a.b라는 정규 표현식의 의미는 다음과 같다.

"a + 모든_문자 + b"

 

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

 

 

\a[.]b의 정규 표현식은 "a + . + b"와 같다. 따라서 a.b 문자열과 매치되고 a0b 문자열과는 매치되지 않는다.


 

 

 

* 문자

*은 * 바로 앞에 있는 문자 a가 0부터 무한대까지 반복될 수 있다는 의미이다.


 

 

 

+ 문자

반복을 나타내는 또 다른 메타 문자로 +가 있다. +는 최소 1번 이상 반복될 때 사용한다. 즉, *의 반복 횟수가 0부터라면 +는 반복 횟수가 1부터인 것이다. ca+t의 정규식의 의미는 "c + a가 _1번_이상_반복 + t"이다.


 

 

 

 

{} 문자와 ? 문자

{} 메타 문자를 사용하면 반복 횟수를 고정할 수 있다. {m, n} 쟝규식을 사용하면 반복 횟수가 m부터 n까지인 문자와 매치할 수 있다. m 또는 n을 생략할 수도 있다.

 

1. {m}

 

 

2. {m, n}

 

3. ?

 

b 문자가 있거나 없거나 둘 다 매치되는 경우이다. *, +, ? 메타 무문자는 모두 {m, n} 형태로 고쳐 쓰는 것이 가능하지만, 이해하기 쉽고 표현도 간결한 메타 문자로 사용하는 것이 좋다.

이제 파이썬으로 정규 표현식을 어떻게 사용할 수 있는지 알아볼 것이다.


 

 

 

 

파이썬에서 정규 표현식을 지원하는 re 모듈

파이썬은 정규 표현식을 지원하기 위해 re 모듈을 지원한다. re 모듈은 파이썬을 설치할 때 자동으로 설치되는 표준 라이브러리로, 사용 방법은 다음과 같다.

 

re.compile을 사용하여 정규 표현식을 컴파일한다.


 

 

 

정규식을 이용한 문자열 검색

이제 컴파일된 패턴 객체를 사용하여 문자열 검색을 수행해 보자. 컴파일된 패턴 객체는 다음과 같은 4가지 메서드를 제공한다.

 

match, search는 정규식과 매치될 때는 match 객체를 리턴하고 매치되지 않을 때는 None을 리턴한다. match 객체란 정규식의 검색 결과로 리턴된 객체를 말한다.

먼저 다음과 같은 패턴을 만들어본다.

 

이제 이 패턴 객체로 앞에 나온 메서드를 사용해 볼 것이다.


 

 

 

1. match

match 메서드는 문자열의 처음부터 정규식과 매치되는지 조사한다. 

 

"python" 문자열은 [a-z]+ 정규식에 부합되므로 match 객체가 리턴된다.

 

"3 python" 문자열은 처음에 나 오는 문자 3이 정규식 [a-z]+에 부합되지 않으므로 None으로 리턴된다.


 

 

 

2. search

컴파일된 패턴 객체 p를 가지고 search 메서드를 수행해 본다.

 

 

"python" 메서드에 첫 번째 문자는 3이지만, search는 문자열의 처음부터 검색하는 것이 아니라 문자열 전체를 검색하기 때문에 3 이후의 python 문자열과 매치된다.

이렇듯 match 메서드와 search 메서드는 문자열의 처음부터 검색할지의 여부에 따라 다르게 사용해야 한다.


 

 

 

 

3. findall

 

패턴([a-z]+)과 매치되는 모든 값을 찾아 리스트로 리턴한다. 근데 대문자를 쓰면 그 문자는 리턴하지 않는다.


 

 

 

4. finditer

 

finditer는 findall과 동일하지만 그 결과로 이터레이터 객체를 리턴한다. 그리고 이터레이터 객체가 포함하는 각각의 요소는 match 객체이다.

 


 

 

 

학습을 마치고

정규 표현식 나머지 부분이 절반 정도 남아있는데 그 내용은 너무 어렵기도 하고 지금은 별로 쓸데가 없을 것 같아 여기서 정규 표현식 공부는 마치기로 했다. 

그래도 정규 표현식에 대해 많은 것들을 배울 수 있었다. 그리고 나중에는 정규식도 사용할 수 있을 것 같다.