[Python] 정규 표현식 문자열 검색 - match, search, findall, finditer

미남로그·2021년 9월 14일
0
post-custom-banner

저는 점프투파이썬 교재로 공부합니다. 이 교재를 바탕으로 공부한 걸 정리합니다.

정규 표현식 시리즈

1️⃣ 정규표현식이란? 문자 클래스, Dot(.), 반복(*), 반복(+), 반복({m,n}, ?)
2️⃣ 정규 표현식(2) - 문자열 검색(match, search, findall, finditer)
3️⃣ 정규표현식(3) - match 객체의 메서드(group, start, end, span)
4️⃣ 정규표현식(4) - COMPILE 옵션 - (DOTALL, IGNORECASE, MULTILINE, VERBOSE)
5️⃣ 정규 표현식(5) - 백슬래시 문제('\n')
6️⃣ 정규 표현식(6) 메타 문자 - |, ^, $, \A, \Z, \b, \B
7️⃣ 정규표현식(7) 그루핑, 전방 탐색, 문자열 바꾸기, Greedy vs Non-Greedy



re 모듈

파이썬은 정규 표현식을 지원하기 위해 re 모듈을 제공합니다. re 모듈은 파이썬을 설치할 때 자동으로 설치되는 기본 라이브러리입니다.

사용 방법은 간단합니다.

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

re.compile을 사용하여 정규 표현식을 컴파일합니다. re.compile의 결과로 돌려주는 객체 p를 사용하여 그 이후의 작업을 수행합니다.

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

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

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


패턴을 하나 만들어 두겠습니다.

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

이 정규 표현식의 의미는 무엇입니까? [a-z] 소문자 알파벳 중 하나를 의미하고, +은 왼쪽에 최소 한 번부터 무한대까지를 의미합니다.

그럼 '[a-z]+'의 의미는 소문자 알파벳으로 시작하는 무한대의 문자열을 의미하겠습니다!


match

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

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

<re.Match object; span=(0, 6), match='python'>

python 문자는 정규식에 부합하므로 match 객체를 돌려줍니다.

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

None

3 python은 정규식에 부합되지 않으므로 None을 돌려줍니다.

match의 결과로 match 객체 또는 None을 돌려주기 때문에 파이썬 정규식 프로그램은 다음과 같은 흐름으로 작성합니다.

import re

p =re.compile(정규표현식)
m = p.match("조사할 문자열")
if m:
    print("Match found: ", m.group())
else:
    print("No match")

즉, match의 결괏값이 있을 때만 그다음 작업을 수행할 수 있습니다.


컴파일된 패턴 객체 p를 갖고 이번에는 search 메서드를 수행해 보겠습니다.

import re

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

<re.Match object; span=(0, 6), match='python'>

"python" 문자열에 search 메서드를 수행하면 match 메서드를 수행했을 때와 동일하게 매치된다.



import re

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

<re.Match object; span=(2, 8), match='python'>

"3 python" 문자열의 첫 번째 문자는 "3"이지만 search는 문자열의 처음부터 검색하는 것이 아니라 문자열 전체를 검색하기 때문에 "3" 이후의 "python" 문자열과 매치된다.

이렇듯 match 메서드와 serach 메서드는 문자열의 처음부터 검색할지의 여부에 따라 다르게 사용해야 한다.


findall

이번에는 findall 메서드를 수행해 보겠습니다.

import re

p = re.compile('[a-z]+')
result = p.findall("life is too short")
print(result)

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

"life is too short" 문자열의 "life", "is", "too", "short" 단어를 각각 [a-z]+ 정규식과 매치해서 리스트로 돌려준다.


finditer

이번에는 finditer 메서드를 수행해보자

import re

p = re.compile('[a-z]+')
result = p.finditer("life is too short")
print(result)

<callable_iterator object at 0x00000188401D47F0>
<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'>

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

profile
미남이 귀엽죠
post-custom-banner

2개의 댓글

comment-user-thumbnail
2024년 10월 26일

감사합니다

1개의 답글