알고리즘 연습 사이트에서 문제를 풀고 나서 다른 분들의 코드를 보면 난데없이 외계어가 적혀있는 경우가 있다.
그리고 그런 경우에는 대개 코드가 짧고 간결한데, 바로 정규표현식을 사용한 것이다.

정규표현식?

  • 정규표현식은 복잡한 문자열을 처리하는데 사용하는 기법이다.
  • 문자열을 처리하는 모든 언어에서 사용이 가능하다.
  • 어렵지만 알면 편리하다.

어디에 쓰나?

점프 투 파이썬에 나오는 예제를 인용하고자 한다.

주민등록번호를 포함하고 있는 텍스트가 있다. 이 텍스트에 포함된 모든 주민등록번호의 뒷자리를 * 문자로 변경하시오.

이 문제를 정규표현식 없이 풀 경우, 다음과 같은 순서로 프로그램을 작성해야할 것이다.

  1. split을 이용해서 전체 텍스트를 공백 문자로 나눈다.
  2. 나눠진 단어들이 주민등록번호 형식인지 조사한다.
  3. 단어가 주민등록번호 형식이라면 뒷자리를 *로 바꾼다.
  4. 나눠진 단어들을 다시 조립한다.
data = """
park 800905-1049118
kim 700905-1059119
"""

result = []
for line in data.split("\n"):
    word_result = []
    for word in line.split(" "):
        if len(word) == 14 and word[:6].isdigit() and word[:7].is digit():
            word = word[:6] + '-' + '*******'
        word_result.append(word)
    result.append(" ".join(word_result))
print('\n'.join(result))

하지만 정규표현식을 사용한다면 아주 간결하게 코드를 작성할 수 있다.

import re

data = """
park 800905-1049118
kim 700905-1059119
"""

pat = re.compile("(\d{6})[-]\d{7}")
print(pat.sub('\g<1>-*******', data))

만약 찾고자 하는 문자열이나 바꿔야 할 문자열의 규칙이 더욱 복잡하다면 정규표현식은 더욱 강력한 힘을 발휘한다.

메타 문자

메타 문자: 원래의 뜻이 아닌, 특별한 용도로 쓰이는 문자.

메타 문자의 종류: . ^ $ * + ? {} [] ₩ | ()

문자 클래스 [ ]

  • [ ][ ]안에 들어 있는 문자들과 매치 여부를 판단한다.
  • 정규 표현식이 [abc]라면 이 표현식의 의미는 ‘a,b,c,중 한 개의 문자든 매치하는 지’를 의미한다.
  • [ ]안에 -이 들어간다면 -는 두 문자 사이의 범위를 의미한다. [abc][a-c]로 표현이 가능한 것이다.

문자클래스 [] 안에서의 ^

  • ^반대의 의미를 가진다.
  • 앞서 봤던 [ ]-로 [0-9]라는 표현식을 만들면, 모든 숫자를 의미하는데, 앞에 ^을 붙여 [^0-9]로 만든다면, 숫자가 아닌 모든 것을 의미하게 되는 것이다.

메타 문자 ^, $

  • ^가 문자클래스 외부에 있을 때는 반대의 의미가 아닌, 문자열의 처음을 의미한다.
  • $는 문자열의 마지막을 의미한다.
  • 이는 추후 컴파일 옵션을 다룰 때 더 자세히 살펴보겠다.

메타 문자 .

  • .은 줄바꿈 문자 \n을 제외한 모든 문자와 매치된다.
  • a.ba + 어떤 문자 + b와 같은 것이다.
  • 예를 들어, a.babb, a0b등과 매치되는 것이다.
  • .[]안에서 사용된다면, 문자 .을 의미한다.

메타 문자 *, +, {}

  • *은 문자 반복을 의미한다.
  • 반복 횟수는 0~무한대다. 그 문자가 없어도 되는 것이다.
  • a*b라 하면, b, aab, aaaaaaaaab등과 매치된다.

  • +역시 문자 반복을 의미한다.
  • 단, 반복 횟수가 1~무한대다. 해당문자가 존재해야 한다.
  • a+b라 하면, ab, aaaaaab 등이 매치된다. 하지만 b는 매치되지 않는다.

  • {m,n}을 이용해서 반복횟수가 m부터 n개 까지인 반복을 표현할 수 있다.
  • {m,n}을 사용하여 m개부터 n개까지로 제한할 수 있다.
  • a{2}b라 하면 a가 정확히 2번 반복되는 aab와 매치가 된다.
  • a{2,5}b라 하면, a가 2번에서 5번까지 반복될 수 있는 것이다.

메타문자 ?

  • ?는 {0,1}을 의미한다.
  • a?b라 하면, a가 있어도 되고 없어도 된다는 의미이기에, b와도 매치가 되고 ab와도 매치가 된다.

자주 사용하는 문자 클래스

  1. \d - 숫자와 매치 [0-9]와 같다.
  2. \D - 숫자가 아닌 것과 매치 [^0-9]와 같다.
  3. \s - 공백 문자와 매치 [\t\n\r\f\v]와 같다.
  4. \S - 공백 문자가 아닌 것과 매치 [^\t\n\r\f\v]
  5. \w - 문자 + 숫자와 매치 [a-zA-Z0-9]와 같다.
  6. \W - 문자 + 숫자가 아닌 것과 매치 [^a-zA-Z0-9]와 같다.

다음에는 이러한 메타문자를 사용한 정규 표현식을 어떻게 사용하지는 알아보겠다.

참고