파이썬 정규표현식 탐욕스럽다

박은정·2021년 7월 22일
0

정규표현식의 탐욕 제어 : 마침표. & 물음표?

정규표현식에서 말하는 탐욕스럽다(greedy) : 문자를 집어 삼킨다
마침표는 모든 문자를 다 의미하기 때문에 반복하면 모든 문자를 집어삼키는 특성이 있다

탐욕스러운 개념 예시 1

'저는 91년에 태어났습니다. 97년에는 IMF가 있었습니다. 지금은 2020년입니다.' 라는 문장에서 연도만 따로 추출하는 정규표현식

원하는 결과 : '91년', '97년', '2020년' 세 개의 값을 가진 리스트 반환

문장 맨 앞의 숫자부터 ~ 맨 뒤의 '년' 사이 모든 문자를 집어 삼킴

# 먼저 example1이라는 객체에 간단한 문장을 입력한다
>>> example1 = '저는 91년에 태어났습니다. 97년에는 IMF가 있었습니다. 지금은 2020년입니다.'

# 숫자(\d)로 시작하고, 어떤 문자던(.) 반복(+)되며, '년'으로 끝나는 문자열을 반환하려고 명령한다
>>> re.findall(r'\d.+년', example1)

# 문장 맨 앞의 숫자부터 맨 뒤의 '년' 사이 모든 문자를 반환한다
['91년에 태어났습니다. 97년에는 IMF가 있었습니다. 지금은 2020년']

탐욕을 멈추는 방법 : 물음표 삽입

# '년'이라는 글자를 찾으면 패턴 찾기를 멈춘다
>>> re.findall(r'\d.+?년', example1)
['91년', '97년', '2020년']

# 숫자를 반복시킨 후 '년'으로 끝나는 문자를 찾아도 된다
>>> re.findall(r'\d.+년', example1)
['91년', '97년', '2020년']

탐욕스러운 예시 2

예시1처럼 .+ 명령어를 탐욕스럽게 인식해서

>> example = '이동민 교수는 다음과 같이 설명했습니다(이동민, 2019).
그런데 다른 학자는 이 문제에 대해서 다른 견해를 가지고 있었습니다(최재영, 2019).
또 다른 견해도 있었습니다(Lion, 2018).'

# 앞에 \ 를 붙이지 않으면 문자로 인식되지 않으니 주의!!
>>> result = re.findall(r'\(.+\)', example)

>>> result
['(이동민, 2019).
그런데 다른 학자는 이 문제에 대해서 다른 견해를 가지고 있었습니다(최재영, 2019).
또 다른 견해도 있었습니다(Lion, 2018)']

닫는 괄호 앞에 ?를 달아줘서 제대로 검색되도록 한다

>>> result = re.findall(r'\(.+?\)', example)
>>> result
['(이동민, 2019)', '(최재영, 2019)', '(Lion, 2018)']
profile
새로운 것을 도전하고 노력한다

0개의 댓글