Languages/Python

[파이썬] 정규표현식 사용하기 / re모듈 사용법

MOONCO 2021. 3. 19. 08:46

정규표현식이란?

 

[프로그래밍] 정규표현식이란?

정규표현식이란? 문자열을 처리하는 방법 원하는 문자를 검색하거나, 찾아서 바꿀 수 있다. 정규표현식에 사용되는 메타 문자 원래 그 문자가 가진 뜻이 아닌 특별한 용도로 사용하는 문자 . ^ $

defineall.tistory.com

 

re 란?

파이썬에서 정규표현식을 사용하기 위한 기본 라이브러리

 

re 불러오기, 정규표현식 사용해보기

import re

# 정규표현식 규칙 정하기(컴파일,패턴을 돌려준다.)

p = re.compile('ab*')

 


정규표현식 이용해서 검색하기

 

re 모듈 내장 함수(Method) 목적
match() 문자열의 처음부터 정규식과 일치하는지 조사한다.
search() 문자열 전체를 검색하여 정규식과 일치하는지 조사한다.
findall() 정규식과 일치하는 모든 문자열을 리스트로 돌려준다.
finditer() 정규식과 일치하는 모든 문자열을 반복 가능한 객체로 돌려준다.

 

match 이용하기

import re

# 문자열 반복과 일치하는 것 선택하는 정규표현식 만들기

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



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

# 'python'은 다 문자이므로 일치

# <_sre.SRE_Match object at 0x01F3F9F8>



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

# '3 python'은 처음에 숫자 3이 오므로 불일치 / None을 돌려줌

# None

 

search 이용하기

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



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

# 'python'은 다 문자이므로 일치

# <_sre.SRE_Match object at 0x01F3F9F8>



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

# '3 python'은 문자가 들어가므로 일치

# <_sre.SRE_Match object at 0x01F3FA30>

 

findall 이용하기

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

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

# 정규식 조건에 일치하는 모든 문자를, 리스트 형식으로 돌려줌

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

 

finditer 이용하기

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

result = p.finditer("life is too short")
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>

 

간단하게 사용하기

result = re.match('[a-z]+',"python")

 match, search의 내장 함수

함수명 목적
group() 일치하는 문자열을 돌려준다
start() 일치하는 문자열의 시작 위치를 돌려준다.
end() 일치하는 문자열의 끝 위치를 돌려준다.
span() 일치하는 문자열의 (시작, 끝)에 해당하는 튜플을 돌려준다.

 

match에서 내장 함수 이용하기

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

result = p.match("python")
m.group()

# 'python'

m.start()

# 0

m.end()

# 6

m.span()

(0, 6)

 

search에서 내장 함수 이용하기

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

result = p.search("3 python")
m.group()

# 'python'

m.start()

# 2

m.end()

# 8

m.span()

(2, 8)

 


컴파일 할때 옵션 주기

옵션 설명
DOTALL(S) (.) 이 줄바꿈문자도 선택한다
IGNORECASE(I) 대소문자 상관없이 선택한다
MULTILINE(M) ^, $ 과 사용
VERBOSE(X) verbose모드 사용 ( 정규식 간소화 )

 

DOTALL(S) 사용하지 않을 때

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

# (.)은 기본적으로 \n(줄바꿈) 문자를 인식하지 않는다.

m = p.match("a\nb")
print(m)

# None

DOTALL(S) 사용할 때

import re

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

# p = recompile('a.b', re.S) 도 사용가능

# 이제 (.)이, \n(줄바꿈) 문자를 인식한다

m = p.match("a\nb")
print(m)

# <_sre.SRE_Match object at 0x01FCF3D8>

 

IGNORECASE(I) 사용하기

import re
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>

 

MULTILINE(M) 사용하지 않을 때

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

# ^은 문자열 처음을 의미, $는 문자열 마지막을 의미

# ^python은 문자열의 처음이 항상 python으로 시작되어야 선택된다

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

print(p.findall(data))

# python one

MULTILINE(M) 사용할때

import re
p = re.compile('^python\s\w+', re.M)

# ^은 문자열 처음을 의미, $는 문자열 마지막을 의미

# ^python은 문자열의 처음이 항상 python으로 시작되어야 선택된다

# 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"""
&[#]
(
    0[0-7]+
  | [0-9]+
  | x[0-9a-fA-F]+  # Hexadeciaml
)
;
""", re.VERBOSE)

# re.VERBOSE가 중간의 공백문자들(whitespace)를 제거해준다 / 보기 쉽게 작성가능

# '#'사용해서 주석도 활용할 수 있다

 

백슬래시( \ ) 문자열 찾기

"\section" 문자열 찾기위한 정규식 만들기

p = re.compile("\section")

\s는 whitespace로 해석되어 의도한대로 선택이 되지않는다.

[ \t\n\r\f\v]ection

 

의도한대로 선택하기

# \\ : 문자'\'를 의미함

# 파이썬에선, 함수를 두번 거치므로 \\\\ => \\ => \(최종) 형식으로 변환되어 전달된다. 

# 기본형

p = re.compile("\\\\section")

# 축약형

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




 

반응형