본문 바로가기

Programming/Python

[Python] 정규표현식(Regular Expressions) - re 모듈 (2)

파이썬에서 정규 표현식을 지원하는 re 모듈

import re
p = re.compile('ab*')

 

- re.compile을 사용하여 정규표현식을 컴파일

- re.compile의 결과로 돌려주는 객체 p(컴파일된 객체)를 사용하여 그 이후 작업 수행

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

match( ) 문자열의 처음부터 정규식(정규표현식)과 매치되는지 조사
search( ) 문자열 전체를 검색하여 정규식과 매치되는지 조사
findall( ) 정규식과 매치되는 모든 문자열을 리스트로 반환
finditer( ) 정규식과 매치되는 모든 문자열을 반복 가능한 객체로 반환

match( )와 search( )는 정규식과 매치될 때는 match 객체 반환, 매치되지 않을 때는 None 반환

 

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

match

문자열의 처음부터 정규식(정규표현식)과 매치되는지 조사

문자열 'python'은 [a-z]+ 정규식에 부합되므로 match 객체를 반환

 

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

>> match 객체 반환

search

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

 

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

>> 객체 반환

m = p.serach("3 python")
print(m)

>> 3 이후의 python 문자열과 매치

findall

정규식과 매치되는 모든 문자열을 리스트로 반환

 

result = p.findall("life is too short")
print(result)

>> ['life', 'is', 'too', 'short']

finditer

정규식과 매치되는 모든 문자열을 반복 가능한 객체로 반환

 

>>> result = p.finditer("life is too short")
>>> print(result)
<callable_iterator object at 0x01F5E390>
>>> for r in result: print(r)
...
<re.Match object; span=(0, 4), match='life'>
<re.Match object; span=(5, 7), match='is'>
<re.Match object; span=(8, 11), match='too'>
<re.Match object; span=(12, 17), match='short'>

match 객체의 메서드

method 목적
group( ) 매치된 문자열을 반환
start( ) 매치된 문자열의 시작 위치 반환
end( ) 매치된 문자열의 끝 위치 반환
span( ) 매치된 묹열의 (시작, 끝)에 해당하는 튜플 반환

match 메서드와 search 메서드의 start 차이

(match는 무조건 0, search는 start 값이 다르게 나올 수 있음)

 

>>> m = p.match("python")
>>> m.group()
'python'
>>> m.start()
0
>>> m.end()
6
>>> m.span()
(0, 6)
>>> m = p.search("3 python")
>>> m.group()
'python'
>>> m.start()
2
>>> m.end()
8
>>> m.span()
(2, 8)

 

re.compile을 사용하여 컴파일된 패턴 객체로 이후의 작업 수행

re.match로 코드를 축약할 수 있음

(한 번 만든 패턴 객체를 여러번 사용해야할 때는 re.compile 사용이 편리함)

컴파일 옵션

DOTALL(S) . 이 줄바꿈 문자를 포함하여 모든 문자와 매치할 수 있도록 함
IGNORECASE(I) 대소문자에 관계없이 매치할 수 있도록 함
MULTILINE(M) 여러줄과 매치할 수 있도록 함 ( ^, $ 메타문자의 사용과 관계가 있는 옵션)
VERBOSE(X) verbose모드를 사용할 수 있도록 함 (정규식을 보기 편하게)

DOTALL, S

. 메타 문자는 줄바꿈 문자(\n)를 제외한 모든 문자와 매치되는 규칙임

만약 \n 문자도 포함하여 매치하고 싶다면 re.DOTALL 또는 re.S 옵션을 사용해 컴파일 하면 됨

보통 re.DOTALL 옵션은 여러 줄로 이루어진 문자열에서 \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)

>> \n과 상관없이 객체 반환

IGNORECASE, I

대소문자 구별 없이 매치를 수행할 때 사용하는 옵션

 

p = re.compile('[a-z]+', re.I)
p.match('python')
>> 객체 반환
p.match('PYTHON')
>> 객체 반환

MULTILINE, M

^ : 문자열의 처음을 의미 (^python - 문자열의 처음은 항상 python으로 시작)

$ : 문자열의 마지막을 의미 (python$ - 문자열의 마지막은 항상 python으로 끝나야함)

 

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

# python이라는 문자열로 시작하고
# 그 뒤에 whitespace
# 그 뒤에 단어가 와야함을 의미

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

print(p.findall(data))

>> ['python one']

 

^ 메타 문자에 의해 python이라는 문자열을 사용한 첫 번째 줄만 매치

re.MULTILINE 또는 re.M을 이용하여 각 라인의 처음으로 인식시키고 싶을 때 사용

^, $ 메타 문자를 문자열의 각 줄마다 적용해줌

 

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']

VERBOSE, X

charref = re.compile(r'&[#](0[0-7]+|[0-9]+|x[0-9a-fA-F]+);')
charref = re.compile(r"""
 &[#]                # Start of a numeric entity reference
 (
     0[0-7]+         # Octal form
   | [0-9]+          # Decimal form
   | x[0-9a-fA-F]+   # Hexadecimal form
 )
 ;                   # Trailing semicolon
""", re.VERBOSE)

 

re.VERBOSE 옵션을 사용하면 문자열에 사용된 whitespace는 컴파일할 때 제거됨 ([ ] 안에 사용한 whitespace는 제외)

줄 단위로 #기호를 사용하여 주석문을 작성할 수 있음

백슬래시 문제

문자열 앞에 r문자 삽입하여 Raw String 규칙으로 인해 \ 2개 대신 1개만 써도 2개를 쓴것과 같은 동일한 의미를 가짐

 

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

참고

https://wikidocs.net/4308#match

 

07-2 정규 표현식 시작하기

[TOC] ## 정규 표현식의 기초, 메타 문자 정규 표현식에서 사용하는 메타 문자(meta characters)에는 다음과 같은 것이 있다. > ※ 메타 문자란 원래 ...

wikidocs.net