전체 페이지뷰

2016년 12월 1일 목요일

Regular expression with Python, "re"

파이썬 정규표현식은 re 모듈에 의해 지원되므로 파이썬 쉘에서

>>> import re


를 쳐봅시다. 그 후 패턴 매칭을 시험해보도록 합니다. 그러기 위해서 우리는 패턴을 컴파일해서 bytecode로 변형할 필요가 있습니다. 이 바이트코드는 추후 C로 작성된 엔진에 의해 실행될 것입니다.

>>> pattern=re.complie(r'\bfoo\b')

패턴을 컴파일 했으면 매칭을 시도해 봅니다.

>>> pattern.match("foo bar")
<_sre.SRE_Match object; span=(0, 3), match='foo'>

Backslash in string literal

정규식은 파이썬 언어의 코어가 아니기 때문에 다른 문자열 다루는 것과는 문법적 차이가 좀 있습니다. 앞에서 살펴본 것 처럼 백슬래시(\)는 정규식에서는 특정한 메타캐릭터 이기도 하고 특정 문자의 escape 용으로도 쓰입니다. 그래서 우리는 \를 문자로 사용하기 위해서는 그것을 escape 하기 위해 백슬래시를 덧붙여서 \\로 사용합니다. 그래야만 \를 메타캐릭터가 아닌 문자로 사용 가능합니다.

>>> pattern=re.compile("\\\\")
>>> pattern.match("\\author")
<_sre.SRE_Match object; span=(0, 1), match='\\'>

보다시피 이 경우 패턴이 길어지면 보기가 힘들어집니다.
그래서 파이썬에서는 raw string notation을 뜻하는 r을 지원합니다. 그래서 문자영 앞에 r을 덧붙이면 메타캐릭터를 무시하고 전체를 문자로 간주합니다. 그래서  r"\b" 라고 쓰면 백스페이스를 뜻하는 특수문자가 아닌 \b라는 문자 자체로 처리합니다.

파이썬 정규식의 구성요소

파이썬에는 정규식을 다루는 두가지  object가 있습니다.
RegexObject: Pattern object로도 부르며, 컴파일 된 정규식을 말합니다.
MatchObject: 매칭된 패턴을 뜻합니다.

RegexObject

패턴 매칭을 시작하기 전에, 우리는 우선 정규식을 컴파일 해야 합니다. 그 결과로 얻어진 것이 pattern object 혹은 RegexObject입니다. 이 객체는 정규식에 자주 쓰이는 몇가지 연산들에 대한 메소들들을 가지고 있습니다(차차 알아보도록 하겠습니다).

정규식을 컴파일해서 우리는 패턴매칭 등의 작업에 쓰이는 재사용 가능한 객체를 얻습니다.
'<HTML>'이라는 문자열을 찾고자 할 때 우리는 다음과 같은 방법을 사용할 수 있습니다.

>>> pattern = re.compile(r'<HTML>')
>>> pattern.match("<HTML>")
<_sre.SRE_Match object; span=(0, 6), match='<HTML>'>

이 때, pattern은 RegexObject입니다. 
반면에 객체를 생성하지 않고 모듈 상에서 직접 수행할 수도 있습니다.

re.match(r'<HTML>', "<HTML>")

re 모듈이 직접 wrapper를 제공하여 내부적으로 regexObject를 생성한 뒤 메소드에 응답합니다. 따라서 먼저 컴파일 하지 않고도 연산이 가능한 것입니다.

그러나 직접 연산을 수행하면 cache를 프로그래머가 직접 제어하지 못하므로 메모리 문제가 생기게 됩니다. 그래서 cahe를 비우기 위해 re.purge 와 같은 명령을 해줘야 하는데 이는 비효율적입니다. 그래서 객체를 생성해서 사용하면 사용이 끝난후 자동으로 해제가 되므로 메모리를 신경 쓸 필요가 없어집니다.

이제 이 pattern object가 수행할 수 있는 중요한 연산들에 대해 알아봅시다.

댓글 없음:

댓글 쓰기