TOP
class="layout-aside-left paging-number">
본문 바로가기
데이터분석 만능열쇠 [파이썬]/<파이썬 기초>

[파이썬] 파이썬기초: 정규 표현식(Regular Expressions) - 2

by 기록자_Recordian 2024. 6. 22.
728x90
반응형
시작에 앞서
해당 내용은 '<Do it! 점프 투 파이썬> 박응용 지음. 이지스 퍼블리싱' 을 토대로 작성되었습니다. 보다 자세한 내용은 해당 서적에 상세히 나와있으니 서적을 참고해 주시기 바랍니다.

이전 내용
 

[파이썬] 파이썬기초: 정규 표현식(Regular Expressions) - 1

시작에 앞서해당 내용은 ' 박응용 지음. 이지스 퍼블리싱' 을 토대로 작성되었습니다. 보다 자세한 내용은 해당 서적에 상세히 나와있으니 서적을 참고해 주시기 바랍니다.정규 표현식(Regular Ex

puppy-foot-it.tistory.com


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

 

파이썬은 정규 표현식을 지원하기 위해 re(regular expressions의 약어) 모듈을 기본 라이브러리(파이썬을 설치할 때 자동으로 설치) 제공한다.

# 정규 표현식 re 모듈
import re
p = re.compile('ab*') #정규 표현식(ab*)을 컴파일

 

※ 컴파일(compile) 이란? [출처: 티스토리 블로그 '메모장' https://bradbury.tistory.com/226]

컴파일은 인간이 이해할 수 있는 언어로 작성된 소스 코드(고수준 언어 : C, C++, Java 등)를 CPU가 이해할 수 있는 언어(저수준 언어 : 기계어)로 번역(변환)하는 작업을 말한다.

우리가 C, C++, Java로 작성하는 소스 코드는 컴퓨터가 이해할 수 없다. 컴퓨터는 0, 1로 이루어진 기계어만 이해할 수 있기 때문이다. 따라서 우리가 작성한 소스 코드를 컴퓨터가 이해할 수 있게 0, 1로 이루어진 기계어로 번역하는 컴파일 과정이 필요하다.

소스 코드는 컴파일을 통해 기계어로 이루어진 실행 파일이 된다. 이 파일을 실행하면 실행 파일 내용이 운영체제의 Loader를 통해 메모리에 적재되어 프로그램이 동작한다.


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

 

컴파일된 패턴 객체는 아래와 같은 4가지 메서드를 제공한다.

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

 

▶ match, search는 정규식과 매치될 때는 match 객체를 돌려주고, 매치되지 않을 때는 None을 돌려준다.

 

먼저 아래와 같은 패턴을 만들고

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

 

◆ match: 문자열의 처음부터 정규식과 매치되는지 조사

 

위 패턴으로 match 메서드를 수행하면

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

▶ "python" 문자열은 [a-z]+ 정규식에 부합하므로 match 객체를 돌려준다.

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

"3python" 문자열은 [a-z]+ 정규식에 부합하지 않으므로 None을 돌려준다.

 

★ 파이썬 정규식 프로그램은 보통 다음과 같은 흐름으로 작성

# 파이썬 정규식 프로그램
p = re.compile(정규 표현식)
m = p.match("조사할 문자열")
if m:
    print('Match found: ', m.group())
else:
    print('No match')

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

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

n = p.search("3python")
print(n)

▶ "python" 문자열에 search 메서드를 수행하면 match 메서드를 수행할 때와 동일

"3python" 문자열에 search 메서드를 수행하면 문자열의 첫 번째는 "3"이나, search는 문자열의 전체를 검색하기 때문에 "3" 이후의 "python"가 매치된다.


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

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

단어를 각각 [a-z]+ 정규식과 매치해서 리스트로 돌려준다.


◆ finditer: 정규식과 매치되는 모든 문자열(substring)을 반복 가능한 객체로 반환

# finditer
result = p.finditer("Life is too short")
print(result)

▶ finditer는 findall가 동일하나 그 결과로 반복 가능한 객체를 돌려준다. (반복 가능한 객체가 포함하는 각각의 요소는 match 객체)

for r in result: print(r)


match 객체의 메서드

 

메서드 목적
group( ) 매치된 문자열을 돌려준다
start( ) 매치된 문자열의 시작 위치를 알려준다
end( ) 매치된 문자열의 끝 위치를 알려준다
span( ) 매치된 문자열의 (시작, 끝)에 해당하는 튜플을 돌려준다.

 

▶ 이를 통해 어떤 문자열이 매치 되었는지, 매치된 문자열의 인덱스는 어디부터 어디까지 인지 등을 알 수 있다.

 

# match 객체의 메서드
import re
p = re.compile('[a-z]+')
m = p.match("python")

print(m.group())
print(m.start())
print(m.end())
print(m.span())

 

※ search 메서드를 사용하면 start 값은 다르게 나온다.

# search 메서드
m = p.search("3python")

print(m.group())
print(m.start())
print(m.end())
print(m.span())


re 모듈 축약형

 

re 모듈은 축약한 형태로 사용할 수 있는 방법을 제공한다.

p = re.compile('[a-z]+')
m = p.match("python")

#축약형
m = re.match('[a-z]+', "python" )

 


컴파일 옵션

 

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

 

▶ 옵션을 사용할 때는 re.DOTALL 처럼 옵션 이름을 사용해도 되고 re.S 처럼 약어를 사용해도 된다.


 

DOTALL, S

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

(* 보통 여러 줄로 이루어진 문자열에서 \n에 상관 없이 검색할 때 많이 사용)

# 컴파일 옵션: DOTALL, S (줄바꿈 포함)
import re
p = re.compile('a.b')
m = p.match('a\nb')
print(m)

▶ 정규식이 a.b인 문자열 a\nb는 \n은 . 메타 문자와 매치되지 않기 때문에 매치되지 않는다.

 

만약 매치되게 하려면 다음과 같이 re.DOTALL 옵션을 사용해야 한다.

p = re.compile('a.b', re.S) #또는 re.DOTALL
m = p.match('a\nb')
print(m)


IGNORECASE, I

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

#  IGNORECASE, I (대소문자 구분 없이)
p = re.compile('[a-z]', re.I) #또는 re.IGNORECASE
print(p.match("python"))
print(p.match("Python"))
print(p.match("PYTHON"))

▶ [a-z] 정규식은 소문자를 의미하나, re.I 옵션으로 대·소문자 구별 없이 매치된다.


MULTILINE, M

메타 문자 ^, $와 연관된 옵션.

(* ^: 문자열의 처음 / $: 문자열의 마지막)

# MULTILINE, M(문자열의 처음^ 과 끝 $)
import re
p = re.compile("^python\s\w+")
#python 이라는 문자열로 시작하고
#그 뒤에 whitespace(공백)
#그 뒤에 w(단어)가 와야 한다는 의미

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

print(p.findall(data))

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

 

이를 각 라인의 처음으로 인식시키고 싶은 경우는 re.M을 사용하여 다음과 같이 작성하면 된다.

# MULTILINE, M(문자열의 처음^ 과 끝 $)
# 각 라인의 처음 인식
import re
p = re.compile("^python\s\w+", re.M)

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

print(p.findall(data))


VERBOSE, X

이해하기 어려운 정규식을 주석 또는 줄 단위로 구분할 수 있는 옵션

# VERBOSE, X (정규식을 주석 또는 줄 단위로 구분)
# charref = re.compile(r'&[#](0[0-7]+:[0-9]+:x[0-9a-fA-F]+);')

import re

charref = re.compile(r"""
    &[#]               # '&' 문자와 '#' 문자
    (             
        0[0-7]+        # 8진수로 이루어진 숫자 (0으로 시작하고 그 뒤에 0에서 7까지의 숫자가 나옴)
        |[0-9]+        # 또는 10진수로 이루어진 숫자 (0에서 9까지의 숫자가 나옴)
        |x[0-9a-fA-F]+ # 또는 16진수로 이루어진 숫자 (x로 시작하고 그 뒤에 0-9와 a-f, A-F 문자가 나옴)
    )             
    ;                  # 세미콜론 문자
""", re.VERBOSE)

 

▶ 이해 안되고 복잡한 정규식을 re.VERBOSE 옵션을 사용하여 주석을 적고 여러 줄로 표현하여 가독성을 좋게 만들었다.

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


백슬래시 문제

 

예를 들어 "\section" 문자열을 찾는 정규식을 만든다고 가정할 때,

\s 문자 whitespace로 해석되어 의도한 대로 매치가 이루어지지 않는다.

▶ \s 문자가 이스케이프 코드로 해석 되며, 마찬가지로 \t \n \r \f \v 동일한 문제 발생

 

따라서, "\section" 문자열을 의도한 대로 매치하고 싶다면

\\section 으로 변경해야 한다. (백슬래시 2개를 사용하여 이스케이프 처리)

 

예를 들어, "\television" 이라는 문자열이 "\t" 와 매치되는지 확인하면,

# 백슬래시 정규식 표현
p = re.compile('\\t')
m = p.match('\television')
print(m)

 

※ Raw String 규칙

정규식 엔진에 \\ 문자를 전달하려면 \\\\ 처럼 백슬래시를 4개나 사용해야 하는데,

이와 같이 \를 사용한 표현이 계속 반복되는 정규식이라면 너무 복잡하니 이를 해결하기 위해

컴파일 해야 하는 정규식이 Raw String 임을 알려 줄 수 있도록 파이썬 문법을 만들었다.

# Raw String 규칙
p = re.compile(r'\\t')
m = p.match('\\television')
print(m)

 


다음 글

 

[파이썬] 파이썬기초: 정규 표현식(Regular Expressions) - 3

시작에 앞서해당 내용은 ' 박응용 지음. 이지스 퍼블리싱' 을 토대로 작성되었습니다. 보다 자세한 내용은 해당 서적에 상세히 나와있으니 서적을 참고해 주시기 바랍니다.이전 내용 [파이썬]

puppy-foot-it.tistory.com

 

728x90
반응형