정규식은 텍스트에서 특정 패턴에 부합되는지 판단하는 기술이다. 패턴을 적용해서 데이터 조회, 수정, 제한(패턴에 맞지 않으면 실행을 중단하는 등)하는 방법으로 사용될 수 있다. 실행속도도 매우 빠르고 강력한 파워를 가지고 있기 때문에 여러 분야에서 사용된다.
한 가지 단점이 있다면, 배우기 어렵다는 것이다.
정규식에는 평상시와는 다르게 사용되는 특수한 문자들이 여럿 있다. 이 문자들을 meta character라고 부르며 대표적으로는 아래와 같다.
char | 의미 |
---|---|
. | 글자 하나 |
* | 0번 이상 반복됨 |
+ | 1번 이상 반복됨 |
? | 존재하는지 |
{ } | 특정 반복 횟수 지정 |
[] | 한 글자를 찾음 |
[-] | 범위 |
[\^] | Not의 의미 |
^ | ~로 시작하는지 |
$ | ~로 끝나는지 |
( ) | 그룹화(찾을 덩어리 지정) |
\b | 문자와 공백 사이의 문자 찾음 |
\d | 숫자를 찾음 |
\w | 알파벳 + 숫자 + _ 찾음 |
\s | 공백을 찾음(띄어쓰기, tab, 개행 모두 공백으로 판단) |
\t | tab 찾음 |
이 중 ?는 'a?' 이런식으로 사용되는데, 'a'가 존재하거나 존재하지 않거나 상관없이 비교하라는 뜻이다.
그룹화를 할 때에는 캡션이란 것이 있다. 캡션은 그룹화 한 결과를 반환하는 것을 의미하는데, 그룹화만 하고 캡션은 하지 않게 설정하고 싶을 때에는 ?: 키워드를 쓴다.
문자열에서는 역슬래쉬()가 탈출문자로 처리된다. 그런데 정규식에서는 역슬래쉬 역시 문자 그대로 사용되어야 하므로 탈출문자가 아니게 처리 해야 한다. 그래서 사용하는 것이 raw text이고, 문자열 앞에 r을 붙여주거나 re.escapte()
메소드를 사용하면 된다.
예를 들면 다음과 같다.
re.search(r'\bapple\b', data) # -> 역슬래쉬가 탈출문자로 인식되지 않는다!
정규식을 사용하기 위해서는 re 라이브러리르 사용한다. re 라이브러리 중 주요 메소드는 아래와 같으며, 사용 예제를 확인해보자.
# 1. 패턴을 미리 지정하고 그 패턴을 인자로 받아서 데이터 조회하기
p = re.compile('(ABC)+')
m = p.search('ABCABC OK')
print(m)
# 2. 패턴을 미리 지정하지 않고 인자로 바로 전달하기
re.search('(ABC)+', 'ABCABC OK')
둘 다 동일한 결과를 내는데, 굳이 패턴을 미리 지정하는 이유는, 상황에 맞는 패턴을 여러개 미리 지정하고 조건에 갈아끼우는 방식으로 사용이 가능하기 때문에 미리 지정하는 것이다.
예제는 조금 더 찾아본 후 포스팅 하겠다.