python/기타

<정규표현식>자주 사용되는 정규표현식 정리, re.findall과 re.search의 차이

빛날희- 2021. 4. 2. 01:58

 

포스트는 edwith강좌 모두를 위한 파이썬 강의를 수강하며 보충 학습한 글입니다.


 

정규식은 축약된 언어의 한 종류로, 기호로 되어있기 때문에 굉장히 효율적으로 데이터를 뽑거나 찾을 수 있다. 이번 포스팅을 통해 정규식을 정리해보고자 한다.

 

 

▶정규식을 사용하기 위해선. . .

 

우선 import re 명령어를 통해 정규식라이브러리를 불러와야한다.

 

라이브러리엔 많은 메소드가 있지만, 이 포스팅에선 자주 사용되는 search와 findall메소드를 우선 정리해보고자한다.

 

 

▶re.search

 

re.search 메소드는 find()메소드처럼 정규식에 매칭되는 문자열들을 찾을 수 있도록 해준다.

 

이러한 데이터를 가진 텍스트파일에서 From을 포함한 문자열을 뽑고 싶을 때, find()매서드를 사용하면 코드는 다음과 같다.

 

이를 실행하면, 원하는 문자열들을 모두 뽑을 수 있다. 이는 다음과 같이 정규식과 search메소드로도 동일하게 구현해낼 수 있다.

 

만약 line에서 'From:'으로 시작하는 문자열들을 찾고 싶을 땐 위의 for- if문에서 다음과 같이 조금만 정규식을 바꿔주면 된다.

대표사진 삭제

사진 설명을 입력하세요.

원하는 시작문자열 앞에 ^를 붙여주면 그 문자열로 시작하는 문자열을 찾으라는 의미가 된다. search메소드의 경우, 해당 문자열이 정규식을 만족시키는지를 T/F형태로 리턴한다. 따라서 바로 위의 코드의 의미는, 만일 line에서 'From:'으로 시작하는 문자열이 존재하여 True를 반환한다면 그 때 line을 출력하라는 소리가 된다. 즉, search메소드가 False를 반환하면 해당 line은 출력하지 않는 것이다.

 

 

▶re.findall

 

T/F형태로 리턴하는 것이 아닌 문자열 그 자체를 추출하고 싶을 때 사용하는 것이 findall 메소드이다. 이 메소드를 실행하면 대상정규식에 해당하는 모든 문자열들을 리스트형태로 반환한다.

 

txtstr= 'my FAVORITE numbers are 29, 4, 194'

출처 입력

txtstr문자열에서 숫자데이터를 추출하고자 한다. 이럴땐 다음과 같이 코드를 작성한다.

>>>x=re.findall('[0-9]+',txtstr)

>>>print(x)

['29','4','194']

출처 입력

정규식에서 [0-9]는 0에서 9까지의 숫자리스트에서 하나의 숫자를 가리키고 뒤의 +는 하나의 숫자가 한번이상 반복되는 문자열을 추출하라는 의미이다.

 

마찬가지로 txtstr에서 대문자로 이뤄진 문자열을 추출하고 싶을 땐 다음과 같이 코드를 작성한다.

>>>y=re.findall('[A-Z]+', txtstr)

>>>print(y)

['FAVORITE']

출처 입력

정규식에서 [A-Z]+ 대문자로 이뤄진 하나의 문자가 한번이상 반복되는 문자열을 추출하라는 의미이다.

 

이처럼 findall 메소드는 정규식에 해당하는 문자열들을 추출한 리스트들을 반환한다.

 

 

▶여러 정규식 표현들

 

^: 바로 뒤에 오는 문자로 시작하는 문자열 검색

$: 바로 앞에 오는 문자로 끝나는 문자열 검색

. : 아무 문자검색

*: 바로 앞선 문자가 0 혹은 그 이상 반복되는 문자열 검색

*?: 바로 앞선 문자가 0 혹은 그 이상 반복되는 문자열을 검색하되, 검색되는 문자열을 최소한으로 짧게 검색

+: 바로 앞선 문자가 1 혹은 그 이상 반복되는 문자열 검색

+?: 바로 앞선 문자가 1 혹은 그 이상 반복되는 문자열을 검색하되, 검색되는 문자열을 최소한으로 짧게 검색

\s: 공백문자를 매칭

\S: 공백문자 아닌 문자를 매칭

[aeiou]: 소문자인 aeiou 단일문자와 매칭되는 문자열 검색

[AEIOU]: 대문자인 AEIOU 단일문자와 매칭되는 문자열 검색

[a-z]: 소문자인 단일문자와 매칭되는 문자열 검색

[A-Z]: 대문자인 단일문자와 매칭되는 문자열 검색

[^ ]: 공백이 아닌 문자열 검색

(): 정규표현식에서 섬세한 문자열을 추출하고자 할때 ()안에 해당하는 문자열들만 검색하여 추출

 

 

<Example>

 

1.

re.search 파트에서 활용한 텍스트 파일을 활용하여, From으로 시작하는 문자열에서 @다음으로 오는 문자열들을 정규표현식으로 추출해보자.

-> '^From .*@([^ ]+)'

(From으로 시작하고 아무 문자가 0번이상 반복된 후 @문자가 나타나면 그 이후 괄호안에 있는 문자열 부터 추출시작한다. 공백이 아닌 문자가 1번이상 반복되는 문자열을 추출한다.)

 

2.

'Favorite: Icecream:'이라는 문자열에서 Favorite:을 추출하자.

-> '^F.+?:'

(F로 시작하고 아무 문자가 1번이상 반복된후 :로 끝나는 문자열 중 가장 짧은 문자열을 추출한다.)

 

!! 주의!!

+뒤에 ?문자를 써주지 않으면 정규식은 가장 길게 매칭되는 경우인 Favoirte: Icecream:을 모두 추출한다. 이를 방지하기 위해 해당 정규식에 매칭되는 가장 짧은 문자열을 추출하도록 제한해주는 것이 바로 ?문자이다.

 

 

정규표현식에 대한 자세한 설명은 다음 url을 참고하자.

https://www.wikidocs.net/4308

 

위키독스

온라인 책을 제작 공유하는 플랫폼 서비스

wikidocs.net