정규식은 문자열에서 특정한 패턴이 있는 문자열을 추출하기 위해서 사용한다.
1. 모듈 re
're'는 정규 표현식을 사용하기 위한 모듈이다.
're'가 작동하는 것은 패턴의 매칭, 치환, 분리로 크게 나눌 수 있다. 패턴을 '매칭'하여 매칭되는 것을 다른 것으로 '치환'하거나 매칭된 것을 '분리'하는 식으로 동작한다.
파이썬은 re 모듈을 지원하기에 간단히 import해서 사용한다.
문자열을 특정 문자로 나눌 수 있다.
re 모듈이 아닌, 내장함수로도 split는 지원한다.
영어 뜻 그대로 편집하고 수집한다는 의미 그대로 쓰인다.
문자열에서 찾으려는 패턴을 기입하면, 그 패턴에 맞는 것을 수집하여 반환하거나 편집하여 반환한다.
아래의 예를 잠시 보자.
먼저 어떤 문자열이 주어지고, 그 문자열에서 찾으려는 패턴을 compile을 이용하여 패턴을 기입한다. 패턴에 입력되는 문법은 잠시 후에 자세히 살펴보겠다. 아래의 패턴 의미는 'ids'는 문자가 1개 이상이 있는 문자열을 찾는 것을 의미하고 nums는 숫자가 6개 그리고 '-'가 오고 그 다음 숫자 7개가 오는 패턴을 찾는 형식이다.
이렇게 패턴을 만든 후에 컴파일된 객체는 메서드를 지원하는데 그 중에서 'search'를 사용하여 찾아보자.
반환되는 것은 span에는 index를 match에는 컴파일한 형식과 일치하는 문자열을 반환한다.
그리고 이렇게 반환된 것을 search 객체의 메서드를 활용하여 반환받을 수 있다.
문자열을 반환받는 group를 사용하여 아래와 같이 반환받는다.
2. 문법과 객체 메서드
찾으려는 패턴을 지정할 때 문자열(대괄호)로 지정할 수 있다.
[abc]는 문자열 중에서 'a', 'b', 'c'를 찾을 때 쓰며 하이픈'-'을 넣어 순서대로 [처음-끝]으로 사용가능하다. [a-b]는 [abc]와 같다.
보통 한정하지 않고 모든 대소문자의 문자와 숫자를 쓰기에 보통은 다음과 같이 쓴다.
[a-zA-Z] : 알파벳 모두
[0-9] : 숫자 모두이 안에 메타 문자를 '^' 넣어서 '~빼고'의 의미로 쓸 수 있다.
[^a-zA-Z] : 알파벳 빼고 모두
[^0-9] : 숫자 빼고 모두
문자 앞은 역슬러쉬를 취한다.
\d : 숫자와 매치, [0-9]와 같다.
\D : 숫자가 아닌 것과 매치, [^0-9]와 같다.
\s : 스페이스나 탭과 줄 바꾸기 등의 공백인 문자와 매치, [\t\n\r\f\v]와 같다.
\S : 공백을 표현하는 것이 아닌 문자와 매치, [^\t\n\r\f\v]와 같다.
\w : 알파벳과 숫자와 매치, [a-zA-Z0-9]과 같다.
\W : 알파벳과 숫자가 아닌 것과 매치, [^a-zA-Z0-9]과 같다.
보통은 위의 특수문자를 사용하는 것이 일반적이나 찾는 문자열을 직접 배치해도 된다.
. + * {} ? ^ |
'.'은 줄바꿈 문자를 제외한 어떤 문자가 올 수 있다. 아래와 같이 문자 k, m사이에 줄바꿈 문자를 제외한 문자가 있는 패턴을 찾는다.
'+'는 앞의 패턴이 1번 이상 반복되는 패턴을 찾는다. 아래와 같이 문자(\w)가 1번 이상 반복되는 패턴을 찾는다.
'*'는 앞의 패턴이 0번 이상 반복되는 패턴을 찾는다. '+'은 1개부터
+과 *은 0 혹은 1번부터 무한대(메모리상 2억번 정도 반복)까지 반복되는 반면, {}를 사용하여 반복 횟수를 지정할 수 있다.
{3, 9}는 3번 이상 9번 이하 반복
{ , 9}는 0개 이상 9번 이하 반복
{9} 9번 반복
아래는 숫자가 6번 반복 후에 하이픈'-' 그 다음 숫자가 7번 반복되는 패턴을 찾는 것이다.
'?'은 {0, 1}과 같다. 어떤 패턴이 있어도 되고 없어도 되는 상황에서 쓰인다.
'^'은 패턴이 처음과 일치하는 것만 찾는다.
'$'은 '^'과 반대로 끝과 매치되는 것을 찾는다.
'|'는 or 연산을 하는데 a|b 둘 중 하나의 패턴을 만족하면 반환한다.
컴파일 객체 메서드
정규 표현식을 이용하여 문자열의 패턴을 찾는 대략적인 순서는,
먼저 찾으려는 패턴을 re모듈의 compile를 사용하여 작성한다.
그리고 작성된 컴파일의 매서드를 통해 문자열을 던져주고 패턴이 일치되는 것을 반환받는다.
마지막으로 이 반환받은 것을 객체 매서드를 통해서 찾은 문자열이나 인덱스를 사용한다.
import re
com = re.compile('\w{3}') # compile 작성
wd = com.match('문자열') # 메서드를 이용한 서치
wd.group() # 반환받은 것을 사용
패턴을 지정한 컴파일 메서드들
문자열의 '처음'부터 매치 되는지 확인하며, 매치되면 반환하고 매치되지 않으면 None을 반환한다.
문자열의 전체를 검색하여 매치 되는지 확인하며, 매치되면 반환하고 매치되지 않으면 None을 반환한다.
아래와 같이 처음부터 확인하는 match는 패턴이 일치하지 않으면 바로 None를 반환하는 반면,
search는 모든 문자열을 확인하기에 모든 문자열 중에서 일치되는 문자열이 있으면 반환한다.
group() : 매치된 문자열을 반환한다.
start() : 매치된 문자열의 시작 인덱스를 반환한다.
end() : 매치된 문자열이 마지막 인덱스를 반환한다.
span() : 매치된 문자열의 (처음, 마지막) 인덱스를 각각 반환한다.
패턴과 매칭이 되는 문자열 모드를 리스트로 반환한다.
패턴과 매칭이 되는 문자열 모두를 반복 가능한 객체(itorator)를 반환한다.
compile를 사용하지 않고 바로 패턴을 던져 찾을 수 도 있다.
하지만 compile를 사용하여 변수에 지정하면 패턴을 반복 사용할 때 편리하다.