전체 페이지뷰

2016년 12월 3일 토요일

Regular expression with Python, Module & Compile

Module Operation

re 모듈을 사용하는 두가지 유용한 메소드들을 확인해 봅시다.


escape()

아스키 문자와 숫자, '_'를 제외하고 패턴에서 나타나는 모든 문자들을 escape 해줍니다.

>>> re.findall(re.escape("^"), "^like^")
['^', '^']

^는 메타캐릭터이지만 escape 메소드를 거치면서 escape 되어 리터럴화 되었습니다.

purge()

전에 설명한 것처럼 메모리 릴리즈에 쓰입니다.


Compilation flags

컴파일 시에 적용할 수 있는 옵션에 대해 알아보겠습니다.

re.IGNORECASE or re.I

대소문자 구분없이 매칭시키고자 할 때 사용됩니다.

>>> pattern = re.compile(r"[a-z]+", re.I)
>>> pattern.search("Felix")
<_sre.SRE_Match object; span=(0, 5), match='Felix'>
>>> pattern.search("felix")
<_sre.SRE_Match object; span=(0, 5), match='felix'>

re.MULTILINE or re.M

여러 줄로 이루어진 문자열의 라인의 각각에서 매치시키고자 할 때 사용됩니다.
다음의 예를 봅시다.

>>> pattern = re.compile("^\w+\:⇢(\w+/\w+/\w+)")
>>> pattern.findall("date:⇢12/01/2013⇢\ndate:⇢11/01/2013")
['12/01/2013']

/로 구분된 날짜를 찾고자 사용한 패턴입니다. ^을 사용하였기 때문에 문장의 시작에서 찾게 되므로 첫번째 날짜만 찾아졌습니다.

그러나 re.Multiline 플래그를 주면,
>>> pattern = re.compile("^\w+\:⇢(\w+/\w+/\w+)", re.M)
>>> pattern.findall("date:⇢12/01/2013⇢\ndate:⇢11/01/2013")
['12/01/2013', '11/01/2013']

중간에 \n에 의해 줄바꿈이 이루어지므로 다음 줄 처음도 인식하게 됩니다.

re.DOTALL or re.S

Dot(.)은 \n을 제외한 모든 리터럴과 매칭됩니다. 이때 \n도 매칭에 포함시키고 싶다면 re.DOTALL을 사용하면 됩니다.

>>> re.findall("^\d(.)", "1\ne")
[]

문장의 처음에서 숫자 다음에 나오는 첫 문자를 그룹으로 지정하였지만 매칭되는 결과가 없습니다. 중간에 \n으로 줄바꿈이 되었기 때문입니다.

>>> re.findall("^\d(.)", "1\ne", re.S)
['\n']

re.S 플래그에 의해 \n도 하나의 리터럴로 인식되었음을 알 수 있습니다.

re.VERBOSE or re.X

이 옵션은 정규식 패턴을 보기좋게 주석을 달 때에 사용됩니다.

>>> a = re.compile(r"""\d +  # the integral part
                               \.      # the decimal point
                               \d *   # some fractional digits""", re.X)
>>> b = re.compile(r"\d+\.\d*")

re.X를 사용한 a와 사용하지 않은 b는 완전히 동일합니다. re.X를 사용하면 패턴 내부의 모든 공백은 무시됩니다.

re.DEBUG

컴파일된 식에 대한 디버그 정보를 알려줍니다.

>>> re.compile(r"[a-f|3-8]", re.DEBUG)
IN
  RANGE (97, 102)
  LITERAL 124
  RANGE (51, 56)
re.compile('[a-f|3-8]', re.DEBUG)


지금까지 보아온 것들은 Python3.x 기준입니다. Python2.x 에서 쓰이는 몇몇 메소드들은 제가 임의로 건너 뛰었으므로 혹시 이 글을 보시는 분들은 참고하시기 바랍니다.

댓글 없음:

댓글 쓰기