전체 페이지뷰

2016년 11월 30일 수요일

Regular Expression 2

Literals

리터럴이란 패턴매칭에 사용되는 가장 단순한 형태를 말합니다.

"The quick brown fox jumps over the lazy dog" 이라는 문장에서 /fox/라는 리터럴은 한번만 나타나고, "to be or not to be"라는 문장에서 /be/라는 리터럴은 두번 나타납니다.
"this is outside (this is inside)"라는 문장에서 /(this is inside)/라는 리터럴을 검색하면 결과에 괄호가 나타나지 않습니다. 왜일까요?

그것은 괄호도 메타캐릭터 중의 하나이기 때문입니다.(직관적으로 알 수 있듯이 그냥 묶어서 취급한다는 뜻입니다)

메타캐릭터를 리터럴로 이용하려면 다음의 방법이 있습니다.
1. 앞에 \를 사용(여러 언어들 출력 포매팅 시에 보아온 방법과 유사합니다)
2. 파이썬에서는 re.escape 메소드를 사용합니다.
3. 앞 뒤를 \Q와 \E로 감싸줍니다.(따옴표 quote 시작과 끝 End 라는 뜻입니다)
   - 파이썬에서는 사용되지 않습니다.

정규표현식에는 이런식으로 escape 처리해줘야할 12개의 메타캐릭터가 있습니다.
1. Backslash \
2. Caret ^
3. Dollar sing $
4. Dot .
5. Pipe symbol |
6. Question mark ?
7. Asterisk *
8. Plus sign +
9. Opening parenthesis (
10. Closing parenthesis )
11. Opening square bracket [
12. The opening curly brace {

Character class

문자클래스는 문자집합(character set)이라고도 불리는데,
정해둔 문자열 집합의 원소가 매칭되는가를 판정하는 것이라고 할 수 있습니다.
예를 보면 더 잘 이해가 갈 겁니다.


licence와 license를 모두 맞는 표현이라고 할때 리터럴 가운데 [cs]를 두면 c와 s중 어느 것이 와도 매칭시키는 것입니다.

-기호를 사용해서 문자의 범위도 사용할 수 있습니다.
[a-z]는 소문자 a에서 z까지, [0-9]는 숫자 0에서 9까지를 뜻합니다.
결합해서 작성도 가능합니다. [0-9a-zA-Z]라고 하면 모든 영문자와 숫자를 뜻합니다(띄어쓰기 하지 않습니다)

not을 뜻하는  ^을 이용해서 여집합의 세트도 가능합니다.
[^0-9]라고 하면 숫자가 아닌 것을 뜻합니다.

predefined character class

자주 쓰이는 character class를 미리 정의해 둔 것들이 있습니다.

. 은 개행을 뜻하는 \n을 제외한 모든 문자를 대체 가능
\d 는 0~9까지의 숫자
\D는 숫자를 제외한 모든 것
\s 는 공백문자
\S 는 공백을 제외한 모든 문자
\w 는 모든 영, 숫자
\W 는 영숫자를 제외한 모든 것 을 뜻합니다.

(일반적으로 UNIX에서는 모든 작업이 줄단위로 이루어지므로 개행문자라는 것 자체가 존재하지 않아  . 에서 제외되었습니다.)

한 가지 예를 좀 살펴보도록 하겠습니다.

/.../  세개의 문자(종류 상관없이)
 마침표는 강력한 메타캐릭터이지만 잘못 사용하면 문제를 일으킵니다.
좀 더 정확한 표현식을 쓰려면 character class를 이용하는 편이 좋습니다.
예를 들어 윈도우나 유닉스에서 백슬래시나 슬래시를 제외한 모든 문자에 매치시키는 표현식을 쓰려면 [^\/\]을 사용하는 편이 좋습니다.
^   : not
\/  : / 라는 뜻
\   : \ 라는 뜻

댓글 없음:

댓글 쓰기