정규 표현식

DARTZ·2022년 6월 15일
0

개발

목록 보기
2/4

정규 표현식이란?

정규 표현식(正規表現式, 영어: regular expression, 간단히 regexp 또는 regex, rational expression) 또는 정규식(正規式)은 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어이다.

나는 파이썬을 사용하기 때문에 파이썬을 통해서 알아볼 것이지만 정규표현식은 공통적으로 사용된다. 한번 익혀두면 상당히 사용할 곳이 많은 정규 표현식에 대해 정리해보려고 한다.

강의는 조코딩님의 강의를 참고 했다.

강의 링크

참고 책

정규 표현식을 배워보자!

정규식은 보통 어떤 문자열이 주어졌을 때, 문자열의 규칙을 찾아서 조건과 일치하는 것을 찾아서 원하는 조건으로 변환할 때에 사용된다.

기본 개념

1. 문자 클래스 []

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

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

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

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

2. Dot(.)

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

3. 반복 (*)

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

4. 반복 (+)

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

5. 반복 ({m,n}, ?)

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

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

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

파이썬에서 사용

파이썬에서 정규 표현식을 지원하는 re 모듈

>>> import re
>>> p = re.compile('ab*')

1. match

정확하게 매치가 되는지 검사

import re

p = re.compile('[a-z]+')

m = p.match("python")
print(m)

>>> <re.Match object; span=(0, 6), match='python'>
>>> none # 매치하지 않을 경우

group() 매치된 문자열을 돌려준다.
start() 매치된 문자열의 시작 위치를 돌려준다.
end() 매치된 문자열의 끝 위치를 돌려준다.
span() 매치된 문자열의 (시작, 끝)에 해당하는 튜플을 돌려준다.

해당되는 문자열이 있는지 검사하고 위치를 반환

>>> m = p.search("3 python")
>>> print(m)
<re.Match object; span=(2, 8), match='python'>

3. findall

해당되는 문자열들을 리스트로 만들어준다.

>>> result = p.findall("life is too short")
>>> print(result)
['life', 'is', 'too', 'short']

4. finditer

finditer는 findall과 동일하지만 그 결과로 반복 가능한 객체(iterator object)를 돌려준다. 반복 가능한 객체가 포함하는 각각의 요소는 match 객체이다.

>>> result = p.finditer("life is too short")
>>> print(result)
<callable_iterator object at 0x01F5E390>
>>> for r in result: print(r)
...
<re.Match object; span=(0, 4), match='life'>
<re.Match object; span=(5, 7), match='is'>
<re.Match object; span=(8, 11), match='too'>
<re.Match object; span=(12, 17), match='short'>

5. 컴파일 옵션

DOTALL(S) - . 이 줄바꿈 문자를 포함하여 모든 문자와 매치할 수 있도록 한다.
IGNORECASE(I) - 대소문자에 관계없이 매치할 수 있도록 한다.
MULTILINE(M) - 여러줄과 매치할 수 있도록 한다. (^, $ 메타문자의 사용과 관계가 있는 옵션이다)
VERBOSE(X) - verbose 모드를 사용할 수 있도록 한다. (정규식을 보기 편하게 만들수 있고 주석등을 사용할 수 있게된다.)

>>> p = re.compile('a.b', re.DOTALL)
>>> m = p.match('a\nb')
>>> print(m)
<re.Match object; span=(0, 3), match='a\nb'>
profile
사람들이 비용을 지불하고 사용할 만큼 가치를 주는 서비스를 만들고 싶습니다.

0개의 댓글