< 파이썬(Python) 정규 표현식(regular expression) 사용을 위한 re 모듈 >


* re 모듈이란?

 - 파이썬이 설치될 때 자동으로 설치되는 기본 라이브러리

 - 사용법

>>> import re

>>> p = re.compile('정규표현식') # p는 re.compile의 결과로 리턴되는 패턴객체

 - 패턴(p) : 정규표현식을 컴파일한 결과

 - 정규표현식 컴파일 시 특정 옵션을 주는 것도 가능

 - p 가 사용 가능한 4가지 method : match(), search(), findall(), finditer()

match() 문자열의 처음부터 정규식과 매치되는지 조사하여 match 객체를 리턴, 매치되지 않을 경우에는 None을 리턴

search() 문자열 전체를 검색하여 정규식과 매치되는지 조사하여 match 객체를 리턴, 매치되지 않을 경우에는 None을 리턴

findall() 정규식과 매치되는 모든 문자열(substring)을 리스트로 리턴

finditer() 정규식과 매치되는 모든 문자열(substring)을 iterator 객체로 리턴


* match()

 - 문자열의 처음부터 정규식과 매치되는지 조사하여 match 객체를 리턴, 매치되지 않을 경우에는 None을 리턴

>>> import re

>>> p = re.compile('[a-z]+')

>>> m = p.match("python")

>>> print(m)

<_sre.SRE_Match object at 0x01F3F9F8> # match 객체를 리턴


>>> m = p.match("3 python") # 문자열의 처음에 숫자 3이 나오기 때문에 불일치

>>> print(m)

None


* 정규표현식과 re 모듈의 사용 방식

p = re.compile(정규표현식)

m = p.match( '검색 대상 문자열' )

if m:

        일치할 경우의 명령어

else:

        일치하지 않을 경우의 명령어


* search()

 - 문자열 전체를 검색하여 정규식과 매치되는지 조사하여 match 객체를 리턴, 매치되지 않을 경우에는 None을 리턴

>>> m = p.search("python")

>>> print(m)

<_sre.SRE_Match object at 0x01F3FA68> # match 객체를 리턴


>>> m = p.search("3 python") # 문자열 전체를 검색하므로 중간에 python이 존재하기만 하면 매칭

>>> print(m)

<_sre.SRE_Match object at 0x01F3FA30>


* findall()

 - 정규식과 매치되는 모든 문자열(substring)을 리스트로 리턴

>>> result = p.findall("aaa bbb ccc ddd")

>>> print(result)

['aaa', 'bbb', 'ccc', 'ddd']


* finditer()

 - 정규식과 매치되는 모든 문자열(substring)을 iterator 객체(각각의 요소는 match 객체)로 리턴

>>> result = p.finditer("aaa bbb ccc ddd")

>>> print(result)

<callable_iterator object at 0x01F5E390>

>>> for r in result: print(r)

<_sre.SRE_Match object at 0x01F3F9F8>

<_sre.SRE_Match object at 0x01F3FAD8>

<_sre.SRE_Match object at 0x01F3FAA0>

<_sre.SRE_Match object at 0x01F3F9F8>


* match, serch method가 사용하는 4가지 method : group(), start(), end(), span()

 - group() : 매치된 문자열을 리턴

>>> m = p.match("python")

>>> m.group()

'python'

 - start() : 매치된 문자열의 시작 위치를 리턴

>>> m.start()

0

 - end() : 매치된 문자열의 끝 위치를 리턴

>>> m.end()

6

 - span() : 매치된 문자열의 (시작, 끝) 에 해당되는 튜플을 리턴

>>> m.span()

(0, 6)

 - search method 사용

>>> m = p.search("3 python")

>>> m.group()

'python'

>>> m.start()

2

>>> m.end()

8

>>> m.span()

(2, 8)


* re.compile ~ match 축약

>>> p = re.compile('[a-z]+')

>>> m = p.match("python") # p객체 반복 사용시

--> >>> m = re.match('[a-z]+', "python") # p객체 1회성 사용시


* 정규표현식 compile option (괄호안 내용은 옵션 약어)

 - DOTALL(S) - . 이 줄바꿈 문자를 포함하여 모든 문자와 매치

 - IGNORECASE(I) - 대소문자에 관계없이 매치

 - MULTILINE(M) - 여러줄과 매치 (^, $ 와 연관된 옵션)

 - VERBOSE(X) - verbose 모드를 사용할 수 있도록 (정규식을 보기 편하게 만들수 있고 주석 등을 사용할 수 있게됨)

 - 옵션 약어 사용 : re.DOTALL ==  re.S

 - 옵션 전달 : option은 compile 문의 두번째 인자로 전달(첫번째 인자는 정규표현식)


* re.DOTALL, S : 여러줄로 이루어진 문자열에서 \n에 상관없이 검색하는 경우 사용

>>> import re

>>> p = re.compile('a.b')

>>> m = p.match('a\nb')

>>> print(m)

None


>>> p = re.compile('a.b', re.DOTALL)

>>> m = p.match('a\nb')

>>> print(m)

<_sre.SRE_Match object at 0x01FCF3D8>


* IGNORECASE, I : 대소문자 구분없이 매치를 수행

>>> p = re.compile('[a-z]', re.I)

>>> p.match('python')

<_sre.SRE_Match object at 0x01FCFA30>

>>> p.match('Python')

<_sre.SRE_Match object at 0x01FCFA68>

>>> p.match('PYTHON')

<_sre.SRE_Match object at 0x01FCF9F8>

[a-z] 정규식은 소문자만을 의미하지만 re.I 옵션에 의해서 대·소문자 구분 없이 매치된다.


* MULTILINE, M : ^, $ 를 문자열의 각 라인마다 적용시켜 줌, MULTILINE 옵션 없으면 ^, $는 전체 문자열을 대상으로 함.

 - ^, $와 연관된 옵션

 - ^ : 문자열의 처음

 - $ : 문자열의 마지막


import re

p = re.compile("^python\s\w+")

data = """~~~ 

여러줄 문자

~~~"""

print(p.findall(data))


import re

p = re.compile("^python\s\w+", re.MULTILINE)

data = """~~~ 

여러줄 문자

~~~"""

print(p.findall(data))


* VERBOSE, X : 정규식을 주석 또는 라인 단위로 구분

 - 문자열에 사용된 whitespace는 컴파일 시 제거됨(단 [ ] 내에 사용된 whitespace는 제외).

 - 줄 단위로 #기호를 이용하여 주석문 작성 가능 (r' --> r""")


* Raw String 규칙; 역슬래시(\) 와 Escaping

 - \section ; \s 문자가 whitespace로 해석

   --> escape ; \\section (\가 \ 의 앞에 붙어서 \를 문자 그대로를 나타내도록 escaping 함) 

   --> but 파이썬은 '파이썬의 리터럴 규칙' 에 의해 \\를 \로 해석함.

따라서 --> p = re.compile('\\\\section')

이를 해결하기 위해 나온 규칙이 'Raw String 규칙' ; r 뒤의 정규식은 Raw String 임을 의미함.

   -->  p = re.compile(r'\\section') # 파이썬에 정규표현식 사용시는 주로 r'~~~' 형태로 사용함.



+ Recent posts