정규표현식 기초

HEYDAY7·2021년 5월 14일
0

들어가며

코딩테스트 연습 겸 문제들을 풀다보니 정규표현식이 매우 유용할 때가 많아보였다. 10줄이 되는 코드도 정규표현식으로는 한줄에 끝날 수가 있어서 조금 알아보기로 했다.
사실 정규표현식 또한 하나의 언어라고 볼 수 있기에, 당장 이 글 하나만으로 정규표현식을 마스터 하는 것은 불가능에 가깝다. 다만 알아가는 단계정도, 혹은 정규표현식을 봤을 때 머리가 멈추지 않을 정도로만 알아가보자.
내용은 점프 투 파이썬 wikidocs를 주로 참고했다.

메타문자

정규표현식은 여러 메타문자를 갖고, 이 메타문자를 알아야 정규표현식을 해석하고, 작성할 수 있게 된다. 여기서는 아주 기초적이고 많이 쓰이는 것만 보겠다.

문자클래스 []

[]의 경우 안에 들어가는 문자 중 하나를 칭한다. 즉 [abc]의 경우 abc 중 하나가 되는 것이다. 또 하이픈 - 을 사용하여 범위를 나타낼 수도 있다.

  • [a-z] 는 a부터 z 사이의 문자 중 하나를 의미하게 된다.

백 슬래쉬를 이용해 쉽게 문자 클래스를 나타낼 수 있다.

Dot .

. 은 줄바꿈을 뜻하는 \n을 제외한 모든 문자를 all을 의미한다.

  • p.q : pxq, ptq, pcq 등 p와 q 사이의 아무 문자나 하나 들어간 경우와 매치된다.
    다만 주의해야할점은 pq와 같이 p와 q 사이에 아무것도 들어있지 않은 것은 매칭이 되지 않는다.

반복 +, {}

+의 경우 앞의 문자가 1번 이상 반복되는 것을 의미하고, {}의 경우 앞의 문자가 반복될 수 있는 범위를 뜻한다.

  • 3+ : 3이 1번 이상 반복되는 문자열과 매치된다.
  • a3{1,3}b : 3이 1번에서 3번 반복되는 문자열과 매치된다.
    ex) a3b, a33b, a333b / a3333b는 매칭되지 않음
  • a{1} : 이와같이 {}안에 숫자가 하나 뿐이면 반복되는 정확한 횟수를 의미한다.

위 세개 만으로도 꽤나 쏠쏠하게 정규표현식을 다룰 수 있을 것이다. 그렇다면 이렇게 표현한 정규표현식을 어떻게 활용하는지 살펴보자

re 모듈

파이썬에서는 정규 표현식 지원을 위해서 re(regular expression) 모듈을 제공해준다.

import re

re에는 여러 유용한 method 들이 있다. 그 중에서 개인적으로 가장 유용하다고 느낀 findall 함수를 하나 소개한다.

findall

findall의 경우 내가 목표로 하는 정규표현식에 부합하는 모든 문자열을 리스트로 돌려준다. 단순해 보이지만 이는 굉장히 유용하다! 예제를 한번 보자. 문자와 숫자가 섞여있는 문자열에서 숫자만 빼내고 싶은 상황이 있다고 가정해보자.

text = '12faefa434534gxxczsf622zfvwe124'

result = re.findall('\d+', text)
print(result)

결과가 어떻게 나올까?

["12", "434534", "622", "124"]

아름답지 않은가? 이를 정규표현식 없이 찾아야 했다면... 각 자리의 chr를 일일이 확인하거나, 지독한 split을 해야했을 지도 모른다.

match 객체

이 부분은 아직 미처 학습하지 못했다. 하지만 여러 문서들을 읽어본 결과, re에서 제공하는 match 객체를 잘 활용한다면 아주 유용하게 정규표현식을 활용할 수 있을 것 같다는 생각이 들었다. 이는 추후에 추가적으로 학습하려 한다.

마치며

아주 짧게 정규표현식을 소개했지만, 이 정도만 알더라도 꽤나 자주 코드적인 이득을 볼 수 있을 것이다. 조금 더 다채로운 활용을 위해선 여러 메타문자들을 익히는게 우선이다. 이 글의 시작에 링크해둔 문서가 꽤나 잘 정리되어 있기에 추가적인 학습을 진행한다면 참고해보면 좋을 것 같다. ㅎㅎ

profile
(전) Junior Android Developer (현) Backend 이직 준비생

0개의 댓글