파이썬기초58 : 파이썬에서의 정규표현식 정리
작성자 정보
- 관리자 작성
- 작성일
컨텐츠 정보
- 1,710 조회
- 0 추천
- 목록
본문
정규표현식에서 사용하는 메타문자 종류
.^$*+?{}[]\|()
문자클래스 []
[]사이의 문자들과 매치
[a-zA-Z] : 알파벳모두
[0-9] : 숫자
[^0-9] : 숫자아닌 문자만 매치
자주사용하는 문자클래스
\d :숫자와매치, [0-9]와 동일
\D : 숫자가아닌 것과 매치, [^0-9]와 동일
\s : whitespace문자(space나 tab처럼 공백을 표현하는 문자)와 매치, [ \t\n\r\f\v]와 동일하며 맨앞의 빈칸은 공백을 의미
\S : whitespace문자가 아닌 것과 매치, [^ \t\n\r\f\v]와 동일
\w : 문자+숫자(alphanumeric)와 매치, [a-zA-Z0-9_]와 동일
\W : 문자+숫자(alphanumeric)가 아닌 문자와 매치, [^a-zA-Z0-9_]와 동일
Dot(.)
Dot(.)는 줄바꿈문자인 \n을 제외한 모든 문자와 매치
반복(*)
*바로 앞에 있는 문자가 0부터 무한대로 반복될 수 있다는 의미
반복(+)
+는 최소 1번이상 반복될때 사용한다. *가 반복횟수가 0부터라면 +는 반복횟수가 1부터이다.
반복({m,n}, ?)
{}메타문자를 사용하면 반복횟수를 고정할수 있다. {m,n} 정규식을 사용하면 반복횟수가 m부터 n까지 매치된다. m이 생략되면 0과 동일하고, n이 생락되면 무한대를 의미한다.
? 메타문자가 의미하는 것은 {0,1}이다. 즉 ?자리에 하나가 있어도 되고 없어도 된다.
파이썬에서 정규표현식을 지원하는 모듈 re모듈
파이썬은 정규표현식을 지원하기 위해 re모듈을 제공한다
기본라이브러리이다.
re모듈 사용예
>>> import re
>>> p = re.compile('ab*')
즉, re.compile을 사용하여 정규표현식을 컴파일한다. re.compile의 결과로 돌려주는 객체 p(컴파일된 패턴객체)를 사용하여 그 이후의 작업을 수행하면 된다.
패턴이란 정규식을 컴파일한 결과이다.
정규표현식을 사용한 문자열 검색 메서드 4가지
컴파일된 패턴객체는 다음과 같은 4가지 메서드를 제공한다.
match() : 문자열의 '처음부터' 정규식과 매치되는지 조사한다.
search() : 문자열 '전체를 검색'하여 정규식과 매치되는지 조사한다.
findall() : 정규식과 매치되는 모든 문자열(substring)을 '리스트'로 돌려준다.
finditer() : 정규식과 매치되는 모든 문자열(substring)을 반복 가능한 '객체'로 돌려준다.
파이썬 정규식 프로그램의 기본흐름
p = re.compile(정규 표현식)
m = p.match("조사할 문자열")
if m:
print('Match found: ', m.group())
else:
print('No match')
match객체의 메서드
match객체의 다음과 같은 메서드를 사용하면 "어떤 문자열이 매치되었는지?" 또는 "매치된 문자열의 인덱스는 어디부터 어디까지 인가?"를 알수 있다.
group() : 매치된 문자열을 돌려준다.
start() : 매치된 문자열의 시작위치를 돌려준다.
end() : 매치된 문자열의 끝위치를 돌려준다.
span() : 매치된 문자열의 (시작,끝)에 해당하는 튜플을 돌려준다.
컴파일옵션
정규식을 컴파일할 때 다음옵션을 사용할 수 있다.
DOTALL : dot문자(.)가 줄바꿈 문자를 포함하여 모든 문자와 매치한다. 약어는 S
IGNORECASE : 대.소문자에 관계없이 매치한다. 약어는 I
MULTILINE : 여러줄과 매치한다. (^, $메타문자의 사용과 관계가 있는 옵션이다.) 약어는 M
VERBOSE : verbose모드를 사용한다. (정규식을 보기 편하게 만들수도 있고 주석 등을 사용할 수도 있다. 약어는 X
백슬레시 문제
정규 표현식을 파이썬에서 사용할 때 혼란을 주는 요소가 있다. 바로 백스레시(\)이다.
\section 이 정규식은 \s문자가 whitespace로 해석되어 의도한 대로 매치가 되지 않는다.
즉, \s문자가 이스케이프 코드 \t, \n, \r, \f, \v로 해석된다.
의도한 대로 매치하고 싶다면 다음과 같이 변경한다.
\\section
\문자가 문자열 자체임을 알려주기 위해 백슬레시 2개를 사용하여 이스케이프 처리를 하였다.
따라서 위 정규식을 컴파일하려면 다음과 같이 작성해야 한다.
>>> p = re.compile('\\section')
그런데 여기에서 또하나의 문제가 발견된다. 위처럼 정규식을 만들어서 컴파일하면 실제 파이썬 정규식 엔진에는 파이썬 문자열 리터럴 규칙에 따라 \\이 \로 변경되어 \section이 전달된다.
결국 정규식 엔진에 \\문자를 전달하려면 파이썬은 \\\\처럼 백슬래시를 4개나 사용해야 한다.
(정규식 엔진은 정규식을 해석하고 수행하는 모듈이다. )
>>> p = re.compile('\\\\section')
이렇게 해야만 원하는 결과를 얻을 수 있다. 하지만 너무 복잡하지 않은가?
만약 위와 같이 \를 사용한 표현이 계속 반복되는 정규식이라면 너무 복잡해서 이해하기 쉽지 않을 것이다.
이러한 문제로 인해 파이썬 정규식에는 Raw String규칙이 생겨나게 되었다.
즉, 컴파일해야 하는 정규식이 Raw String임을 알려줄 수 있도록 파이썬 문법을 만든 것이다.
그 방법은 다음과 같다.
>>> p = re.compile(r'\\seciton')
위와 같이 정규식 문자열 앞에 r문자를 삽입하면 이 정규식은 Raw String규칙에 의하여 백슬래시 2개 대신 1개만 써도 2개를 쓴것과 동일한 의미를 갖게 된다.
관련자료
-
이전
-
다음