[Python] 정규식 활용하기

4870 단어 pythonpython

정규식 기초

정규식 모듈을 불러오면 파이썬에서 정규식을 활용할 수 있다.

정규식은 기본적으로 내가 임의로 정한 형식에 맞는지(match), 혹은 그 형식에 맞는 문자열이 있는지(search) 판별하는 것이 기본이다.
아래 예시에서는 문자열 형태로 입력 받은 복소수의 형식을 나타내보았다.

import re

r = re.compile('\d+[+]\d+[i]') # 백슬래시를 써야한다!!
r.match('1+1i')
# <re.Match object; span=(0, 4), match='1+1i'>

위 정규식 형식('\d+[+]\d+[i]')은 '1개 이상의 숫자(\d+)+1개 이상의 숫자(\d+)i' 라는 문자열 형식을 정의한 것이다. (+ 대신 * 를 쓴다면 0개 이상, 즉 없어도 된다는 뜻)

하지만 이 경우, 실수 부분이나 복소수 부분이 음수일 때 마이너스 기호를 놓칠 수도 있다. 따라서 '\d'(0~9) 가 아니라, 특수문자도 포함하는 '\S'(whitespace문자를 제외한 모든 문자)를 쓰는 것이 적절해보인다.

r = re.compile('\S+[+]\S+[i]')
r.match('-1+-1i')
<re.Match object; span=(0, 6), match='-1+-1i'>

참고로, 아래 표기법 정도까지만 익혀두어도 정규식을 활용할 일이 많을 것 같다.
  • \d : 0~9(숫자) == [0-9]
  • \D : 숫자가 아닌 모든 문자 == [^0-9]
  • \w : 숫자+문자 == [a-zA-Z0-9]
  • \W : 숫자+문자가 아닌 모든 문자
  • \s : whitespace문자(대표적으로 줄바꿈 문자인 \n나 공백 그 자체! (' ')) == [ \t\n\r\f\v]
  • \S : whitespace문자가 아닌 모든 문자

[ ] : 대괄호 안에 문자열이 있으면 그 문자열을 포함해야함(앞에 ^이 있으면 제외)

{m,n} : 바로 앞 문자열이 m번 이상 n번 이하 반복. {m} 이라면 m번만 반복

정규식 그루핑

매치를 시킨 것은 좋지만, 실수와 허수 부분을 따로 뽑아내는 방법은 없을까?

이때 사용하는 것이 그루핑이다. 정규식의 일정한 부분에 괄호를 씌우면 그루핑을 활용할 수 있다.

r = re.compile('(\S+)[+](\S+)[i]')
a = r.match('-1+3i')

a.group(1) # '-1'
a.group(2) # '3'

괄호가 묶인 순서가 앞일수록, 바깥쪽 순서대로 그룹에 해당하는 숫자가 매겨진다.

그루핑은 숫자가 아니라 이름으로 따로 지정할 수도 있다!

r = re.compile(r'(?P<real>\S+)[+](?P<imag>\S+)[i]')

괄호 안 앞쪽에 ?P<이름> 형식으로 그룹의 이름을 지정할 수 있다.

a = r.match('-1+3i')
a.group('real') # '-1'
a.group('imag') # '3' 

.
.
.

일정한 형식의 문자열을 여러 개 입력 받아 가공이 필요할 경우 정규식을 활용해보자!

좋은 웹페이지 즐겨찾기