Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

DOing

정규표현식 본문

알고리즘

정규표현식

mangdo 2021. 5. 19. 22:17

정규 표현식을 이용하게되면 원하는 문자열을 간단하게 검색할 수 있습니다.

원하는 문자열이 복잡하더라도 짧고 간결한 코드로 검색할 수 있다는 것이 장점입니다.


💡 정규표현식?

 특정한 규칙을 가진 문자열의 집합을 표현하는데 사용되는 형식언어입니다.

 주로 문자열 검색과 치환에 쓰입니다. 정규표현식은 표준인 POSIX의 정규표현식과 POSIX에서 확장된 perl방식의 PCRE가 대표적입니다. 이외에도 수많은 정규표현식이 존재합니다. 약간의 차이점은 있지만 거의 비슷합니다.

 

💡 정규표현식의 기초, 메타 문자

 정규표현식에 사용하는 기호를 메타 문자라고 합니다. 메타문자는 표현식 내부에서 특정한 의미를 가지는 문자를 말합니다. 지금부터 메타문자의 종류에 대해서 알아보겠습니다.

. ^ $ * + ? { } [ ] \ | ( )

1) 문자클래스 [ ]

[ ]사이의 문자들과 매치됩니다.

[a-z], [0-9] 처럼 하이픈을 사용해서 범위를 나타낼 수 도 있습니다.

 

[abc]가 주어진 정규표현식이라고 가정을 해봅시다.

-"before"는 정규식과 일치하는 문자인 "b"가 있으므로 매치됩니다.

-"dude"는 정규식의 어느 하나의 문자에도 포함하지 않으니 매치되지 않습니다.

 

* 자주 사용하는 문자 클래스

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

  • \d - 숫자와 매치, [0-9]와 동일한 표현식
  • \D - 숫자가 아닌 것과 매치, [^0-9]와 동일한 표현식
  • \s - whitespace 문자와 매치, [ \t\n\r\f\v]와 동일한 표현식. 맨 앞의 빈 칸은 공백문자(space)를 의미한다.
  • \S - whitespace 문자가 아닌 것과 매치
  • \w - 문자+숫자(alphanumeric)와 매치, [a-zA-Z0-9_]와 동일한 표현식.
  • \W - 문자+숫자(alphanumeric)가 아닌 문자와 매치

2) dot(.)

줄바꿈(\n)을 제외한 모든 문자와 매치됩니다.

 

a.b가 주어진 정규표현식이라고 가정을 해봅시다

-aab는 "a"가 dot(.)과 일치하므로 매치됩니다.

-abc는 "a"와 "b"사이에 어떤한 문자도 없기때문에 매치되지않습니다.

 

3) 반복(*)

반복되는 패턴이 존재할 시에 매치됩니다. 이때 주의해야할 점은 0번 반복되어도 매치됩니다.

 

ca*t가 주어진 정규표현식이라고 가정을 해봅시다.

-"ct"는 a가 0번 반복되어 매치됩니다.

-"caaat"는 a가 3번 반복되어 매치됩니다.

 

4) 반복(+)

반복되는 패턴이 존재할 시에 매치됩니다. 이전의 반복(*)과는 달리 1번이상 반복되어야합니다.

 

ca+t가 주어진 정규표현식이라고 가정을 해봅시다.

-"ct"는 a가 0번 반복되어 매치되지 않습니다.

-"caaat"는 a가 3번 반복되어 매치됩니다.

 

5) 반복({m,n})

주어진 횟수만큼 반복되는 패턴이 존재할 시에 매치됩니다.

 

ca{2,5}t가 주어진 정규표현식이라고 가정을 해봅시다.

-"cat"는 a가 1번 반복되어 매치되지 않습니다.

-"caaat"는 a가 3번 반복되어 매치됩니다.

 

5) 반복(?)

0회또는 1회만큼 반복되는 패턴이 존재할 시에 매치됩니다.

 

ca?t가 주어진 정규표현식이라고 가정을 해봅시다.

-"cat"는 a가 1번 반복되어 매치됩니다.

-"ct"는 a가 0번 반복되어 매치됩니다.

-"caaat"는 a가 3번 반복되어 매치되지 않습니다.


 

   지금까지의 메타문자는 매치가 진행될 때 현재 매치되고 있는 문자열의 위치가 변경됩니다. 이를 보통 '소비한다'라는 표현을 사용합니다. 하지만 이와 달리 문자열을 소비하지 않는 메타 문자도 있습니다. 이제부터는 이러한 소비하지 않는 문자열에 대해 알아보겠습니다.

 

6) |

or과 동일한 의미로 사용됩니다. 

 

abc|edf가 주어진 정규표현식이라고 가정을 해봅시다.

- "abcaaa"는 abc를 가지고 있기때문에 매치됩니다.

- "edf"는 edf를 가지고 있기때문에 매치됩니다.

 

7) ^

문자열의 맨처음과 일치함을 의미합니다.

 

^Life가 주어진 정규표현식이라고 가정을 해봅시다.

- "Life is short"는 Life를 문자열의 맨 처음에 가지고 있기때문에 매치됩니다.

- "My Life"는 Life를 문자열의 맨 처음에 가지고 있지는 않기때문에 매치되지 않습니다.

 

8) $

문자열의 맨 끝과 일치함을 의미합니다.

 

short$가 주어진 정규표현식이라고 가정을 해봅시다.

- "Life is short"는 문자열의 마지막이 short로 끝나기 때문에 매치됩니다.

- "Life is short, you need python"은 문자열의 마지막이 short가 아니기 때문에 매치되지 않습니다.

 

9) \b

단어 구분자를 의미합니다. 보통은 whitespace에 의해 구분됩니다.

\b를 사용할 때 주의할 점이 있습니다. \b는 파이썬 리터럴 규칙에 의하면 백스페이스(BackSpace)를 의미합니다. 때문에 백스페이스가 아닌 단어 구분자임을 알려 주기 위해 r'\bclass\b'처럼 Raw string임을 알려주는 기호 r을 반드시 붙여 주어야 합니다.

 

10) \B

 \b의 반대되는 경우입니다. 즉 whitespace로 구분된 단어가 아닌 경우에만 매치됩니다.