IT흔적

[파이썬]정규표현식의 기초[2] - re모듈(match, 컴파일 옵션) 본문

DO it! Python

[파이썬]정규표현식의 기초[2] - re모듈(match, 컴파일 옵션)

흔적남기는 개발자 2019. 1. 22. 20:49

정규표현식을 지원하는 re 모듈

: 파이썬은 정규 표현식을 지원하기 위해 re(regular exprssion) 모듈을 지원한다. 자동으로 설치되는 기본 라이브러리,


>>> import re
>>> p = re.compile('ab*')
# 정규 표현식을 컴파일한다. re.compile의 결과로 리턴되는 객체p(컴파일된 패턴 객체)를 이용하여 그 이후의 작업을 수행할것.   

정규식을 이용한 문자열 검색

 메서드

 목적

 match()

문자열의 처음부터 정규식과 매치되는지 조사한다.

 search()

문자열 전체를 검색하여 정규식과 매치되는지 조사한다. 

 findall()

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

 finditer()

정규식과 매치되는 모든 문자열(substring)을 반복 가능한 객체로 리턴한다. 



match() 하고 search()는 정규식과 매치될 때는 mach객체를 리턴하고 매치되지 않을떄는 None을 리턴한다.

>>> import re
>>> p = re.compile('[a-z]+') # a에서 z까지 문자열에서 z가 최소1번 ~ 무한 사용되어여 매치가능

위 예제를 사용해서 진행해 보겠습니다.

1.match 메서드는 문자열의 처음부터 정규식과 매치되는지 조사한다. 위 패턴에 match 메서드를 수행해 보자.


>>> p = re.compile("[a-z]+") >>> m = p.match("python") >>> print(m) <re.Match object; span=(0, 6), match='python'>


# 매치되지않는 숫자를 사용했을때 값

>>> m = p.match("3 python") >>> print(m) None


2.search는 컴파일된 패턴 객체를 이용해 수행해보자

>>> m = p.search("python") >>> print(m) <re.Match object; span=(0, 6), match='python'>

>>> m = p.search("3 python") >>> print(m) <re.Match object; span=(2, 8), match='python'>


# search 메서드는 전체를 검색하서 매치되는곳부터 시작한다!


3.findall : 모든 문자열들을 리스트[] 안에 나타낸다.


import re

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

b = a.findall("Liverpool is rank first")

print(b)


# 출력값 : ['iverpool', 'is', 'rank', 'first']


4.finditer : 반복객체를 리턴한다.

import re
a = re.compile('[a-z]+')
b = a.finditer("Liverpool is rank first")
print(b)

# <callable_iterator object at 0x00000000027FAEF0>

for i in b:
print(i)

# 출력값 :
# <re.Match object; span=(1, 9), match='iverpool'>
# <re.Match object; span=(10, 12), match='is'>
# <re.Match object; span=(13, 17), match='rank'>
# <re.Match object; span=(18, 23), match='first'>



match 객체의 메서드

메서드 

목적 

group() 

매치된 문자열을 리턴한다. 

start() 

매치된 문자열의 시작 위치를 리턴한다. 

end() 

매치된 문자열의 끝 위치를 리턴한다. 

span() 

매치된 문자열의 (시작, 끝)에 해당되는 튜플을 리턴한다. 

import re

a = re.compile('[a-z]+')
b = a.match("liverpool")

# result = re.match('[a-z]+', "liverpool") 모듈 단위로 가능하다.


b.group()

# liverpool 문자열을 그대로 나타낸다.


b.start()

# 0 위치열을 알려준다 l이 [0]에서 시작하기떄문에 0이다.


b.end()
# 9 마지막 문장위치열이 9이다.

b.span()
# (0, 9) (처음, 끝) 을 알려주는 튜플을 출력 한다.

컴파일 옵션

:정규식을 컴파일할 때 다음과 같은 옵션을 사용할 수 있다.

# 1.DOTALL, S
'''
Dot(.) 메타 문자는 줄바꿈 문자(\n)를 제외한 모든 문자와 매치되는 규칙이 있다. 만약 \n 문자도 포함하여 매치하고 싶다면
re.DOTALL 또는 re.S 옵션을 사용해 정규식을 컴파일하면 된다.
'''

# 제이름을 앞글자 마지막글자를 이용해서 만들어 봤습니다.
import re

>>> a = re.compile('강.웅', re.S)
>>> b = a.match('강\n웅')
>>> print(b)

# 값: <re.Match object; span=(0, 3), match='강\n웅'> 이런식으로 \n 문자까지 포함하고 있습니다.
# 정리: DOTALL(S)는 문자가 아닌것을 같이 쓰고 싶을때 사용한다.

# 2.IGNORECASE, I
'''
대'소문자에 관계없이 매치할 수 있도록 한다.
'''

import re

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

# 값: <re.Match object; span=(0, 1), match='p'>

>>> a.match('PYTHON')

# 값: <re.Match object; span=(0, 1), match='P'>
# 정리: IGNORECASE(I)는 대.소문자 상관없이 값이 출력된다.

# 3.MULTULUNE, M
'''
메타 문자에 대해 간단히 설명하자면 ^는 문자열의 처음을 의미하고, $은 문자열의 마지막을 의미한다
'''
import re

p = re.compile("^python\s\w+") # s\w : whitespace뜻이고 뒤에 단어가 와야한다.

data = """python one
life is too short
python two
you need python
python three"""

print(p.findall(data))

# 값: ['python one']

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

data = """python one
life is too short
python two
you need python
python three"""

print(p.findall(data))

# 값 : ['python one', 'python two', 'python three']


import r

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

data = """life is too short

python one

you need python

python two

you are handsome

python three"""

print(p.findall(data))


# 값: ['python\npython']


# 정리:re.M 옵션으로 인해서 ^메타 문자가 문자열 전체가 아닌 라인의 처음이라는 의미를 갖게 되고 옵션에 ^, $ 문자열의 각 라인마다 적용

백슬래쉬 문제

: 정규표현식을 파이썬에서 사용하려 할 때 혼란을 주게 되는 요소가 한가지 있는데 그것은 바로 백슬래시(\)이다.


ex) \section -> 이 정규식은 \s 문자가 whitespace로 해석되어 의도한 대로 매치가 이루어지지 않는다.

     [\t\n\r\f\v]ection -> \s 문자가 이스케이프 코드 \t,\n,\r,\f,\v로 해석됨


   \\section 


위 정규식을 컴파일 할 때

>>> p = re.compile('\\section')

정규식 엔진에는 파이썬 문자열 리터럴 규칙에 의하여 \\-> \로 변경됨

정규식 엔진에서는

>>> p = re.compile('\\\\section')

 

!!! 이럴때는 

>>> p = re.compile(r'\\section') 


#  이 정규식은 Raw String규칙에 의하여 백슬래시 2개 대신 1개만 써도 2개를 쓴 것과 동일한 의미를 갖게 된다.

'DO it! Python' 카테고리의 다른 글

[파이썬] 정규표현식의 기초[1] - 메타 문자  (0) 2019.01.22