본문 바로가기
Python/Python Library

re 모듈

by 가므자 2012. 4. 20.

re 모듈

re모듈 주요 함수
. compile : 패턴을 컴파일하여 정규식 객체를 리턴한다. (자주사용할 때)
. search, match : 주어진 문자열의 처음부터 패턴 매칭을 시도한다.
. split : 스트링을 분리함.(패턴을 기준으로.. )
. findall : 스트링에서 패턴을 만족하는 모든 문자열을 추출한다.
. sub : 스트링에서 pattern을 repl로 대치한다.
. subn : sub와 동일하나 대치횟수도 함께 전달된다.

re 모듈은 주어진 문자열과 패턴이 매칭되는지(match 함수를 사용하여) 또는 그러한 패턴을 포함하고 있는지(search 함수를 사용하여) 빠르게 검사하는 정규 표현식 처리 장치를 제공한다.

정규 표현식은 축약된 문법으로 기술된 문자열 패턴이다.

[예제 1-54]의 match 주어진 문자열의 처음부터 패턴 매칭을 시도한다.

패턴이 매치되면 (공백 문자까지 포함하여) 이 함수는 매칭된 객체를 반환한다. 무엇이 매치되었는지 탐색하는 데는 group 메소드를 사용한다.

[예제 1-54] re 모듈을 사용하여 문자열 매치하기

file : re-example-1.py

# -*- coding: UTF-8 -*-

import re;

text = "The Attila the Hun Show 1975 years";

# 하나의 문자
m = re.match(".", text);
if m : print repr("."), "=>", repr(m.group(0));

# 어떠한 문자열이라도
m = re.match(".*", text);
if m : print repr(".*"), "=>", repr(m.group(0));

# 알파벳으로 된 문자열
m = re.match("\w+", text);
if m : print repr("\w+"), "=>", repr(m.group(0));

# 알파벳으로 된 문자열 2
m = re.match("[a-zA-Z0-9_]+", text);
if m : print repr("[a-zA-Z0-9_]+"), "=>", repr(m.group(0));

# 숫자로 된 문자열
m = re.match("\d+", text);
if m : print repr("\d+"), "=>", repr(m.group(0));

# 숫자로 된 문자열 2
m = re.match("[0-9]+", text);
if m : print repr("[0-9]+"), "=>", repr(m.group(0));

'.' => 'T'
'.*' => 'The Attila the Hun Show 1975 years'
'\\w+' => 'The'
'[a-zA-Z0-9_]+' => 'The'

패턴 내의 영역을 표시하기 위해 괄호를 사용한다. 패턴이 매치되는 경우, [예제 1-55]의 group 메소드는 이 영역의 컨텐츠를 추출하는데 시용될 수 있다. group(1)은 첫 번째 그룹의 컨텐츠를, group(2)는 두 번째 그룹의 컨텐츠를..., 이런 식으로 개속해서 결과를 반환한다. 만약 여러 개의 숫자를 group 메소드에 전달하면 결과를 튜플로 내어 준다.

[예제 1-55] re 모듈을 사용하여 부분 문자열과 매칭되는 패턴 추출하기

file : re-example-2.py

# -*- coding: UTF-8 -*-

import re;

text = "10/15/99";

m = re.match("(\d{2})/(\d{2})/(\d{2})", text);
if m :
print m.group(1, 2, 3);

('10', '15', '99')

[예제 1-56]의 search 함수는 문자열 내에서 특정 패턴을 검색할 때 사용한다. 이 함수는 기본적으로 문자열의 왼쪽에서부터 위치를 옮겨가면서 가능한 모든 조합을 만들어본다. 이 때 맞는게 있으면 바로 결과를 반환한다. 만약 맞는 것을 발견하지 못하면 None을 반환한다.

[예제 1-56] re 모듈을 사용하여 문자열 검색하기

file : re-example-3.py

# -*- coding: UTF-8 -*-

import re;

text = "Example 3: There is 1 date 10/25/95 in here!";

m = re.search("(\d{2})/(\d{2})/(\d{2})", text);

print m.group(1), m.group(2), m.group(3);

month, day, year = m.group(1, 2, 3);
print month, day, year;

date = m.group(0);
print date;


10 25 95
10 25 95
10/25/95

[예제 1-57]의 sub 함수는 다른 문자열로 패턴을 치환할 때 사용한다.

[예제 1-57] re 모듈을 사용하여 부분 문자열 치환하기

file : re-example-4.py

# -*- coding: UTF-8 -*-

import re;

text = "you're no fun anymore...";

#변수를 치환한다. (string.replace가 더 빠르다.)
print re.sub("fun", "entertaining", text);

# 시퀀스에서 문자가 아닌 것들은 대시로 모두 정리한다.
print re.sub("[^\w]+", "-", text);

# 모든 단어를 소리내기(beep)로 치환한다.
print re.sub("\S+", "-BEEP-", text);

you're no entertaining anymore...
you-re-no-fun-anymore-
-BEEP- -BEEP- -BEEP- -BEEP-

또한 sub 함수를 사용하여 패턴을 치환할 수 있다. 이때는 callback 함수를 통해야 한다. [예제 1-58]은 패턴을 미리 컴파일하는 방법을 보여준다.

[예제 1-58] re 모듈에서 callback 함수를 통해 부분 문자열을 치환하기

file : re-example-5.py

# -*- coding: UTF-8 -*-

import re;
import string;

text = "a line of text\\012another line of text\\012etc...";

def octal(match) :
# 8진수 코드를 대응하는 아스키 코드(ancii code)로 치환한다.
return chr(string.atoi(match.group(1), 8));

octal_pattern = re.compile(r"
\\(\d\d\d)");

print text;
print octal_pattern.sub(octal, text);

a line of text\012another line of text\012etc...
a line of text
another line of text
etc...

re 모듈은 일부러 컴파일하지 않아도 항상 컴파일된 버전을 캐시해 놓는다. 그러므로 작은 스크립트에서 정규 표현식을 컴파일하려고 노력하지 않아도 된다. 파이썬 1.5.2 에서는 캐시가 보통 20개의 패턴을 보유하고 있었다. 그러나 파이썬 2.0에서는 캐시 크기가 100개의 패턴을 보유하도록 늘어났다.

마지막으로, [예제 1-59]는 패턴의 리스트와 문자열을 맞춰 보는 작업 예를 보여주고 있다. 패턴 리스트들은 하나의 패턴으로 결합한 후 미리 컴파일하므로 시간을 절약할 수 있다.

[예제 1-59] re 모듈을 사용하여 문자열을 많은 패턴들과 매치해보기

file : re-example-6.py

# -*- coding: UTF-8 -*-

import re;
import string;

def CombinedPattern(patterns) :
p = re.compile(
string.join(map(lambda x : "(" + x + ")", patterns), "|")
);

def Fixup(v, m = p.match, r = range(0, len(patterns))) :
try :
regs = m(v).regs;
except AttributeError :
return None;
else :
for i in r :
if regs[i + 1] != (-1, -1) :
return i;

return Fixup;

#
# 실행 해보자

patterns = [
r"\d+",
r"abc\d{2,4}",
r"p\w+"
];

p = CombinedPattern(patterns);

print p("129391");
print p("abc800");
print p("abc1600");
print p("python");
print p("perl");
print p("tcl");

0
1
1
2
2
None

[출처] re 모듈|작성자 불끈이

'Python > Python Library' 카테고리의 다른 글

파일 읽고 쓰기 (Reading and Write Files)  (0) 2012.04.23
sys 모듈  (0) 2012.04.23
sys.argv  (0) 2012.04.20

댓글