정규 표현식1
- 정규 표현식에서 사용하는 메타 문자에는 다음과 같은 것이 있다.
- 메타 문자란 원래 그 문자가 가진 뜻이 아닌 특별한 용도로 사용하는 문자를 말한다. 다음과 같은 것들이 있다.
- . ^ $ * + ? { } [ ] \ | ( ))
- 정규 표현식에 위 메타 문자를 사용하면 특별한 의미를 갖게 된다.
- 지금부터 가장 간단한 정규 표현식부터 시작해 각 메타 문자의 의미와 사용법을 알아보자
- 메타 문자란 원래 그 문자가 가진 뜻이 아닌 특별한 용도로 사용하는 문자를 말한다. 다음과 같은 것들이 있다.
- 문자 클래스 []
- 가장 먼저 살펴본 메타 문자는 바로 문자 클래스인 []이다. 문자 클래스로 만들어진 정규식은 "[] 사이의 문자들과 매치"라는 의미를 가진다.
- 문자 클래스를 만드는 메타 문자인 [] 사이에는 어떤 문자도 들어갈 수 있다.
- 즉 정규 표현식이 [abc]라면 이 표현식의 의미는 "a,b,c 중 한 개의 문자와 매치"를 뜻한다.
- 이해를 돕기 위해 문자열 "a","before","dude"가 정규식[abc]와 어떻게 매치되는지 살펴보자
- "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 : 문자+숫자와 매치,[a-zA-Z0-9]와 동일한 표현식이다.
- \W : 문자+숫자가 아닌 문자와 매치, [^a-zA-Z0-9]와 동일한 표현식이다.
- [0-9] 또는 [a-zA-Z]등은 무척 자주 사용하는 정규 표현식이다. 이렇게 자주 사용하는 정규식은 별도의 표기법으로 표현할 수 있다. 다음을 기억해 두자
- Dot(.)
- 정규 표현식의 Dot(.) 메타 문자는 줄바꿈 문자인 \n을 제외한 모든 문자와 매치됨을 의미한다. (참고 : 정규식을 작성할 때 re.DOTALL 옵션을 주면 \n 문자와도 매치된다.)
- 다음 정규식을 보자
a.b
- 위 정규식의 의미 : "a+모든문자+b"
- 즉 a와 b라는 문자 사이에 어떤 문자가 들어가도 모두 매치된다는 의미이다.
- 간단한 예를 들어보자
- 문자열 "aab","a0c","abc"가 정규식 a.b와 어떻게 매치되는지 살펴보자
- "aab"는 가운데 문자 "a"가 모든 문자를 의미하는 .과 일치하므로 정규식과 매치된다.
- "a0b"는 가운데 문자 "0"이 모든 문자를 의미하는 .과 일치하므로 정규식과 매치된다.
- "abc"는 "a"문자와 "b"문자 사이에 어떤 문자라도 하나는 있어야 하는 이 정규식과 일치하지 않으므로 매치되지 않는다.
- 비교해보자 : 만약 다음과 같은 정규식이 있다고 해보자
a[.]b
- 이 정규식의 의미 : "a+Dot(.)문자+b"
- 따라서 해당 정규식은"a.b" 문자열과 매치되고, "a0b" 문자열과는 매치되지 않는다.
- 앞에서 살펴본 문자 클래스[] 내에 Dot(.) 메타 문자가 사용된다면 이것은 "모든 문자"라는 의미가 아닌 문자 "." 그대로를 의미한다. 혼동하지 않도록 주의하자.
반복(*)
ca*t
- 위 정규식에는 반복을 의미하는 메타 문자가 사용되었다. 여기에서 사용한 은 *바로 앞에 있는 문자 a가 0부터 무한대로 반복될 수 있따는 의미이다.(사실 메모리 제한으로 2억 개 정도만 가능하다고 한다.)
- 즉 다음과 같은 문자열이 매치될 수 있을 것이다.
- ct : "a"가 0번 반복되어 매치
- cat : "a"가 0번 이상 반복되어 매치
- caaat : "a"가 0번 이상 즉 3번 반복되어 매치
반복(+)
- 반복을 나타내는 또 다른 메타 문자로 +가 있다. 하지만 +는 최소 1번 이상 반복될 때 사용한다. 즉, *가 반복 횟수 0부터라면 +는 반복 횟수 1부터인 것이다.
- 다음 정규식을 보자
ca+t
- 이 정규식의 의미는 다음과 같다.
- "c + a(1번 이상 반복) + t"
- 따라서 위 정규식은 다음과 매치될 수 있을 것이다.
- ct는 "a"가 0번 반복되어 매치되지 않고 cat,caaat는 1번이상 반복되었기 때문에 매치될 수 있다.
- 그런데 반복횟수를 제한하고 싶을 수 있다.
반복({m,n},?)
- {} 이 메타문자를 사용하면 반복 횟수를 고정할 수 있다. {m,n} 정규식을 사용하면 반복 횟수가 m부터 n까지 매치할 수 있다. 또한 m또는 n을 생략할 수도 있다. 만약 {3,}처럼 사용하면 반복횟수가 3이상인 경우이고 {,3}처럼 사용하면 반복 횟수가 3이하를 의미한다. 생력된 m은 0과 동일하며, 생략된 n은 무한개의 의미를 갖는다.
- {1,}은 +와 동일하고 {0,}은 *와 동일하다.
- 몇 가지 정규식을 살펴보자
- ca{2}t : "c + a(반드시 2번 반복) + t"
- ca{2,5}t : "c + a(2~5회 반복) + t"
- {} 이 메타문자를 사용하면 반복 횟수를 고정할 수 있다. {m,n} 정규식을 사용하면 반복 횟수가 m부터 n까지 매치할 수 있다. 또한 m또는 n을 생략할 수도 있다. 만약 {3,}처럼 사용하면 반복횟수가 3이상인 경우이고 {,3}처럼 사용하면 반복 횟수가 3이하를 의미한다. 생력된 m은 0과 동일하며, 생략된 n은 무한개의 의미를 갖는다.
?
- 반복은 아니지만 이와 비슷한 개념이다.
- ?이 의미하는 것은 {0,1}이다.
ab?c
- 이 정규식의 의미 : "a + b(있어도 되고 없어도 된다) + c"
- , +, ? 메타 문자는 모두 {m, n} 형태로 고쳐 쓰는 것이 가능하지만 가급적 이해하기 쉽고 표현도 간결한 , +, ? 메타 문자를 사용하는 것이 좋다.