알아두면 유용한 정규표현식 기록합니다✍️
1. 정규표현식이란?
정규표현식(正規表現式, Regular Expression)은 문자열을 처리하는 방법 중의 하나로 특정한 조건의 문자를 '검색'하거나 '치환'하는 과정을 매우 간편하게 처리 할 수 있도록 하는 수단이다.
2. 메타 문자
. ^ $ * + ? { } [ ] \ | ( )
정규 표현식에 위 메타 문자를 사용하면 특별한 의미를 갖게 된다.
1) 문자 클래스 [ ]
문자 클래스로 만들어진 정규식은 "[ ] 사이의 문자들과 매치"라는 의미를 갖는다.
[ ] 안의 두 문자 사이에 하이픈(-)을 사용하면 두 문자 사이의 범위(From - To)를 의미한다.
-
[a-zA-Z] : 알파벳 모두
-
[0-9] : 숫자
별도 표기법
-
\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_]와 동일한 표현식이다.
2) Dot(.)
Dot(.) 메타 문자는 줄바꿈 문자인 \n을 제외한 모든 문자와 매치됨을 의미한다.
예시)
a.b -> "a + 모든문자 + b"
a와 b라는 문자 사이에 어떤 문자가 들어가도 모두 매치된다는 의미
3) 반복
① *
* 바로 앞에 있는 문자가 0번부터 무한대로 반복될 수 있다는 의미
(메모리 제한으로 2억 개 정도만 가능하나 무한이라고 표기)
② +
+는 최소 1번 이상 반복될 때 사용
③ {m, n}
반복 횟수를 고정할 때 사용하며 반복 횟수를 m부터 n까지 매치 가능
m 또는 n은 생략이 가능함 (생략된 m은 0, n은 무한대의 의미와 동일)
※ {1,}은 +와 동일하고, {0,}은 *와 동일하다.
④ ?
{0,1}을 의미
바로 앞의 문자가 있어도 되고 없어도 된다는 의미
3. 파이썬에서 사용, re모듈
파이썬은 정규 표현식을 지원하기 위해 re(regular expression의 약어)모듈을 제공한다.
파이썬을 설치할 때 자동으로 설치되는 기본 라이브러리이다.
import re
p = re.compile('ab*')
re.compile을 사용하여 정규 표현식(위 예에서는 ab*)을 컴파일한다.
re.compile의 결과로 돌려주는 객체 p(컴파일된 패턴 객체)를 사용하여 그 이후의 작업을 수행할 것이다.
※ 패턴이란 정규식을 컴파일한 결과이다.
4. 문자열 검색
컴파일된 패턴 객체는 다음과 같은 4가지 메서드를 제공
Method | 목적 |
match() | 문자열의 처음부터 정규식과 매치되는지 조사한다. |
search() | 문자열 전체를 검색하여 정규식과 매치되는지 조사한다. |
findall() | 정규식과 매치되는 모든 문자열(substring)을 리스트로 돌려준다. |
finditer() | 정규식과 매치되는 모든 문자열(substring)을 반복 가능한 객체로 돌려준다. (반복 가능한 객체가 포함하는 각각의 요소는 match 객체) |
match, search는 정규식과 매치될 때는 match 객체를 돌려주고, 매치되지 않을 때는 None을 돌려준다
match로 간단한 예시)
import re
p = re.compile('[a-z]+')
m = p.match("3 python")
print(m)
3이 문자열 처음에 나와 정규식에 부합되지 않으므로 None을 반환할 것이다.
만약에 부합된다면 match 객체를 반환한다.
5. match 객체의 메서드
Method | 목적 |
group() | 매치된 문자열을 돌려준다. |
start() | 매치된 문자열의 시작 위치를 돌려준다 |
end() | 매치된 문자열의 끝 위치를 돌려준다. |
span() | 매치된 문자열의 (시작, 끝)에 해당하는 튜플을 돌려준다. |
6. 모듈 단위 수행, 축약형
지금까지 우리는 re.compile을 사용하여 컴파일된 패턴 객체로 그 이후의 작업을 수행했다.
re 모듈은 이것을 좀 축약한 형태로 사용할 수 있는 방법을 제공한다.
p = re.compile('[a-z]+')
m = p.match("python")
위 코드가 축약된 형태는 다음과 같다.
m = re.match('[a-z]+', "python")
위 예처럼 사용하면 컴파일과 match 메서드를 한 번에 수행할 수 있다.
보통 한 번 만든 패턴 객체를 여러번 사용해야 할 때는 이 방법보다 re.compile을 사용하는 것이 편하다.
7. 컴파일 옵션
정규식을 컴파일할 때 다음 옵션을 사용할 수 있다.
-
DOTALL(S) - . 이 줄바꿈 문자를 포함하여 모든 문자와 매치할 수 있도록 한다.
-
IGNORECASE(I) - 대소문자에 관계없이 매치할 수 있도록 한다.
-
MULTILINE(M) - 여러줄과 매치할 수 있도록 한다.
(^, $ 메타문자의 사용과 관계가 있는 옵션이다
^는 문자열의 처음을 의미하고, $는 문자열의 마지막을 의미) -
VERBOSE(X) - verbose 모드를 사용할 수 있도록 한다.
(정규식을 보기 편하게 만들수 있고 주석등을 사용할 수 있게된다.)
옵션을 사용할 때는 re.DOTALL처럼 전체 옵션 이름을 써도 되고 re.S처럼 약어를 써도 된다.
DOTALL을 활용한 예시)
p = re.compile('a.b', re.DOTALL)
m = p.match('a\nb')
print(m)
참고: 점프 투 파이썬
'Language > Python' 카테고리의 다른 글
[Python] collections모듈 - Counter (0) | 2020.01.05 |
---|---|
[Python] 리스트, 문자열 변환 (0) | 2019.12.30 |
[Python] 집합 자료형 (set) (0) | 2019.12.29 |
[Python] 리스트 인덱스와 값 동시 접근 (enumerate) (0) | 2019.12.29 |
[Python] 문자열 나누기 (split함수) (0) | 2019.12.29 |