⚕️ 정규표현식

팔리동·2021년 8월 16일
0
post-thumbnail

지긋지긋한 정규표현식을 부셔보자

🙋‍♀️ 정규식이 뭔데?

  • 정규 표현식(Regular Expressions)은 복잡한 문자열을 처리할 때 사용하는 기법으로, 파이썬만의 고유 문법이 아니라 문자열을 처리하는 모든 곳에서 사용한다.

🔠 정규식의 기초 메타 문자

정규식에서 사용하는 메타문자(meta characters)에는 다음과 같은 것이 있다.

. ^ * + ? { } \ | ( )

정규식에서 위 메타 문자를 사용하면 특별한 의미를 갖게 된다.

대부분 키보드에서 이런 문자가 왜 있지? 싶었던 것들이 대부분이다. 그래서 정규표현식은 읽기 힘들다 ㅜ

문자 클래스 [ ]

문자 클래스로 만들어진 정규식은 [ ] 사이의 문자들과 매치라는 의미를 갖는다.

  • 🎱 문자 클래스를 만드는 메타 문자인 [ ] 사이에는 어떤 문자도 들어갈 수 있다.

즉 정규표현식이 [abc]라면 이 표현식의 의미는 "a, b, c"중 한 개의 문자와 매치를 의미한다.
예시를 보면서 이해해보자.

  • "a"는 정규식과 일치하는 문자인 "a"가 있으므로 매치
  • "before"는 정규식과 일치하는 문자인 "b"가 있으므로 매치
  • "dude"는 정규식과 일치하는 문자인 a, b, c 중 어느 하나도 포함하고 있지 않으므로 매치되지 않음

[ ] 안의 두 문자 사이에 하이픈(-)을 사용하면 두 문자 사이의 범위(from - to)를 의미한다.
예를 들어 [a-c]라는 정규 표현식은 [abc]와 동일하고 [0-5]는 [012345]와 동일하다.

다음은 하이픈(-)을 사용한 문자 클래스의 사용 예이다.

  • [a-zA-Z] : 알파벳 모두
  • [0-9] : 숫자

문자클래스[]안에는 어떤 문자나 메타 문자도 사용할 수 있지만 주의해야 할 메타 문자가 1가지 있다.
그것은 바로 ^인데, 문자 클래스 안에 ^메타 문자를 사용할 경우 반대(not)라는 의미를 갖는다.
예를 들어 [^0-9]라는 정규식은 숫자가 아닌 문자만 매치된다.

자주 사용하는 문자 클래스

[0-9] 또는 [a-zA-Z] 등은 무척 자주 사용하는 정규 표현식이다. 이렇게 자주 사용하는 정규식은 별도의 표기법으로 표현할 수 있다.

  • \d - 숫자와 매치, [0-9]와 동일한 표현식이다.
  • \D - 숫자가 아닌 것과 매치, [^0-9]와 동일한 표현식이다.
  • \s - whitespace 문자와 매치, [ \t\n\r\f\v]와 동일한 표현식이다. 맨 앞의 빈 칸은 공백문자(space)를 의미한다.
  • \S - whitespace 문자가 아닌 것과 매치, [^ \t\n\r\f\v]와 동일한 표현식이다.
  • \w - 문자+숫자(alphanumeric)와 매치, [a-zA-Z0-9_]와 동일한 표현식이다.
  • \W - 문자+숫자(alphanumeric)가 아닌 문자와 매치, [^a-zA-Z0-9_]와 동일한 표현식이다.
    대문자로 사용된 것은 소문자의 반대임을 추측할 수 있다.

Dot(.)

  • 정규 표현식의 Dot(.) 메타 문자는 줄바꿈 문자인 \n을 제외한 모든 문자와 매치됨을 의미한다.

아래 정규식을 보자
a.b
위 정규식의 의미는 다음과 같다.

"a + 모든문자 + b"

즉, a와 b라는 문자 사이에 어떤 문자가 들어가도 모두 매치된다는 의미이다.

아래 예시를 보며 이해해보자

문자열 "aab", "a0b", "abc"가 정규식 a.b와 어떻게 매치되는지 살펴보자.

  • "aab"는 가운데 문자 "a"가 모든 문자를 의미하는 .과 일치하므로 정규식과 매치된다.
  • "a0b"는 가운데 문자 "0"가 모든 문자를 의미하는 .과 일치하므로 정규식과 매치된다.
  • "abc"는 "a"문자와 "b"문자 사이에 어떤 문자라도 하나는있어야 하는 이 정규식과 일치하지 않으므로 매치되지 않는다.

헷갈릴 수 있는 예시를 보자.
정규식 a[.]b의 의미는 다음과 같다.

"a + Dot(.)문자 + b"

따라서 정규식 a[.]b"a.b" 문자열과 매치되고, "a0b" 문자열과는 매치되지 않는다.

반복(*)

다음 정규식을 보자.

ca*t

이 정규식에는 반복을 의미하는 * 메타 문자가 사용되었다. 여기에서 사용한 ** 바로 앞에 있는 문자 a가 0부터 2억개로 반복될 수 있다는 의미이다.

정규식문자열Match여부설명
ca*tctYES"a"가 0번 반복되어 매치
ca*tcatYES"a"가 0번 이상 반복되어 매치 (1번 반복)
ca*tcaaatYES"a"가 0번 이상 반복되어 매치 (3번 반복)

반복 (+)

  • 반복을 나타내는 또 다른 메타 문자로 +가 있다. +는 최소 1번 이상 반복될 때 사용한다. 즉 *가 반복 횟수 0부터라면 +는 반복 횟수 1부터인 것이다.

다음 정규식을 보자.

ca*t

위 정규식의 의미는 다음과 같다.

"c + a(1번 이상 반복) + t"

위 정규식에 대한 매치여부는 다음 표와 같다.

정규식문자열Match여부설명
ca+tctNo"a"가 0번 반복되어 매치되지 않음
ca+tcatYES"a"가 0번 이상 반복되어 매치 (1번 반복)
ca+tcaaatYES"a"가 1번 이상 반복되어 매치 (3번 반복)

반복 ({m,n}, ?)

  • 반복을 범위를 정할 수 있다.

{ } 메타 문자를 사용하면 반복 횟수를 고정할 수 있다. {m, n} 정규식을 사용하면 반복 횟수가 m부터 n까지 매치할 수 있다. 또한 m 또는 n을 생략할 수도 있다. 만약 {3,}처럼 사용하면 반복 횟수가 3 이상인 경우이고 {,3}처럼 사용하면 반복 횟수가 3 이하를 의미한다. 생략된 m은 0과 동일하며, 생략된 n은 무한대(2억 개 미만)의 의미를 갖는다.

※ {1,}은 +와 동일하고, {0,}은 *와 동일하다.

{ }을 사용한 몇 가지 정규식을 살펴보자.

{m}

ca{2}t

위 정규식의 의미는 다음과 같다.

"c + a(반드시 2번 반복) + t"

위 정규식에 대한 매치여부는 다음 표와 같다.

정규식문자열Match여부설명
ca{2}tcatNo"a"가 1번만 반복되어 매치되지 않음
ca{2}tcaatYES"a"가 2번 반복되어 매치

{m,n}

ca{2,5}t

위 정규식의 의미는 다음과 같다.

"c + a(2~5회 반복) + t"

위 정규식에 대한 매치여부는 다음과 같다.

정규식문자열Match여부설명
ca{2,5}tcatNo"a"가 1번 반복되어 매치되지 않음
ca{2,5}tcaatYES"a"가 2번 반복되어 매치
ca{2,5}tcaaaaatYES"a"가 5번 반복되어 매치

?

  • 반복은 아니지만 이와 비슷한 개념으로 ? 이 있다. ? 메타문자가 의미하는 것은 {0, 1} 이다.

다음 정규식을 보자.

ab?c

위 정규식의 의미는 다음과 같다.

"a + b(있어도 되고 없어도 된다) + c"

위 정규식에 대한 매치여부는 다음 표와 같다.

정규식문자열Match여부설명
ab?cabcYes"b" 가 1번 '사용'되어 매치
ab?cabcYes"b"가 0번 '사용'되어 매치

re 모듈

  • 본문 페이지를 참고하자
profile
배움의 기록

0개의 댓글