Python/Python 모듈탐구

[Python] - 모듈탐구 re - [^정규표현식$?]

정규표현식을 모르고 있는 사람은 아래 포스팅을 읽고 오자

2021.04.17 - [정보보안-이론] - 정규표현식에 대하여

 

정규표현식에 대하여

정규표현식은 여러 목적으로 사용된다. 정규표현식 자체는 어렵지 않다. 정규식(正規式)은 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어이다. < 정규표현식의 정의 : 출

tutoreducto.tistory.com

필자도 정규표현식을 많이 안 써봤지만. Python도 정규표현식을 당연히 지원한다. re(Regular Expression)이라는 모듈을 알아보자.


Python에서 re사용법 

POSIX와 거의 동일하다. 아래는 Python에서 패턴문자가 의미하는 것이다.

패턴문자 설명
. New line을 제외한 모든 문자, 플래그중에 re.DOTALL이 있는데, 이게 설정되면 new line을 포함한 모든 문자가 된다.
^ 문자열의 처음에 일치하는 패턴, re.MULTILINE이 설정되면, 각라인마다 첫 패턴을 검색한다.
$ 문자열의 끝에 일치하는 패턴, re.MULTILINE이 설정되면, 각라인마다 첫 패턴을 검색한다.
* 해당하는 패턴의 0번이상 반복을 탐색 
+ 해당하는 패턴의 1번이상 반복을 탐색 
? 해당하는 패턴의 0번 혹은 1번 매칭을 탐색 
{m} 해당하는 패턴의 m번의 반복을 탐색
{m,n} 해당하는 패턴의 m번 이상 n번 이하 반복을 탐색
{m,n}? 해당하는 패턴의 m번 이상 n번 이하 반복중 최소길이 값을 탐색
\ 이스케이프 지시자
[] 대괄호안에들어간 문자중 하나를 선택
| 파이프기호, 좌변과 우변중하나를 선택

 

re객체의 사용

Python에서 정규표현식을 사용하기 위해서는 우선 정규표현식객체를 생성해야 된다. compile 명령을 다음과 같이 사용한다.

>>> import re
>>> re_object = re.compile("a{3}.*c$")

### re.compile(pattern)으로 사용한다.
### 위 패턴은 3번의 a반복과 0번이상의 아무문자 c로 끝나는 패턴들이다.

이렇게 생성이 된 re객체는 다음과 같은 식으로 사용될 수 있다.

 

match

>>> pat = re_object.match("aaaddc")
>>> pat
<re.Match object; span=(0, 6), match='aaaddc'>
### 문자열 aaaddc는 re_object의 패턴과 정합하니 pat을 생성한다.

>>> pat = re_object.match("a4aaddc")
>>> pat
None
### 문자열 a4aaddc는 re_object의 패턴과 정합하지 않으니, pat이 None이다.

 

match로 생성된 match객체는 다음과 같은 method를 가진다.

 match.group() : 정합된 문자열을 반환한다.
 match.start() : 정합된 문자열의 시작위치를 반환한다.
 match.end() : 정합된 문자열의 마지막위치를 반환한다.
 match.span() : 정합된 문자열 위치의 (시작, 끝)을 튜플로 반환한다.

 

* match객체를 아래처럼 바로 생성할 수 있다.

>>> re_object = re.match("(a{3}.)c$", "aaabbc")

 

search

>>> pat = re_object.search("123 aaaddc")
>>> pat
<re.Match object; span=(4, 10), match='aaaddc'>
### search는 패턴에 정합하는 문자열의 위치를 span(튜플임당)구조로 알려준다

 

findall

>>> re_object = re.compile("a{3}.c")
>>> pat = re_object.findall("aaabbc 123 aaaeec 123")
>>> print(pat)
["aaabbc", "aaaeec"]

### findall은 패턴에 부합되는 모든 결과를 list로 반환한다.
### 좋은 설명을 위해서 re_object를 다시 생성하였다.

 

finditer

>>> re_object = re.compile("a{3}.c")
>>> pat = re_object.finditer("aaabbc 123 aaaeec 123")
>>> pat
<callable_iterator object at 0x000001E22720F5E0>

### findall과 같은데, iterable한 객체를 반환한다. 객체는 하나하나가 match로 yield된다.

 

 

정규식 생성의 옵션

다음과 같은 옵션들이 있다. 

1. VERBOSE, X : 정규식을 여러 줄로 적고, 주석을 달아 세부적인 설명이 가능토록 해준다.

2. MULTILINE, M : 시작검색(^)이나 끝 검색($)이 여러 줄에(new line으로 구분되는) 각 줄에 해당되게 해 준다.

3. IGNORECASE, I : 대소문자 구별 없이 검색을 하게 해 준다.

4. DOTALL, S : 점(.)이 New Line을 포함해서 검색할 수 있게 해 준다.

 

 

* 출처 : Python API docs.python.org/3/library/re.html

 

re — Regular expression operations — Python 3.9.4 documentation

This module provides regular expression matching operations similar to those found in Perl. Both patterns and strings to be searched can be Unicode strings (str) as well as 8-bit strings (bytes). However, Unicode strings and 8-bit strings cannot be mixed:

docs.python.org


re모듈의 사용법에 대해 알아보았다. 정규표현식을 잘 사용하시는 분들의 것을 보면 무슨 암호문 같다. 사용법을 알고 능숙하게는 사용하지는 못하더라도, 읽을 수 있는 정도는 알아두자.