정규 표현식의 기초, 메타 문자
문자 클래스 []
[] 는 그 안에 있는 문자들 중 하나와 일치하는 문자를 찾음
EX) [fpe] 를 apple 에 적용하면 ppe 가 탐색
Dot (.)
어떤 문자가 와도 일치하는 와일드카드 문자
EX) 'a.c' 는 'abc', 'adc', 'afc' 모두 해당
반복 (*)
*은 바로 앞에 있는 문자나 문자 클래스가 0번 이상 반복됨을 나타내는 메타 문자
EX) 'ab*c' 는 'ac', 'abc', 'abbbbbc' 모두 해당
반복 (+)
*과 유사하나 1번 이상 반복됨을 나타내는 메타 문자
EX) 'ab+c' 는 'abc', 'abbbc' 는 해당하지만, 'ac' 는 해당하지 않음
반복 ({m,n}, ?)
{m, n} 은 특정 문자가 m회 이상, n회 이하 반복됨을 나타냄
{m, } 는 특정 문자가 m회 이상, {m} 은 정확히 m회 반복됨을 나타냄
? 는 특정 문자가 0회 또는 1회 등장함을 나타냄
EX) "ab{2,4}c" 는 "abbc", "abbbbc" 모두 해당
EX) "ab?c" 는 "ac", "abc" 는 해당하지만 "abbc" 는 해당하지 않음
정규식을 이용한 문자열 검색
파이썬에서는 re 모듈을 사용하여 정규식을 처리함
re 모듈에서 자주 사용되는 함수들 (인자는 pattern, string, flags=0 으로 모두 동일)
re.search(): 패턴과 일치하는 첫 부분을 찾아 MatchObject로 반환, 없으면 None
re.match(): 패턴이 string의 처음에서부터 일치하는 부분을 찾아 MatchObject로 반환, 없으면 None
re.findall(): 일치하는 모든 부분 list로 반환
re.finditer(): 일치하는 모든 부분 MatchObject 의 이터레이터 반환
반환된 MatchObject 는 group, strat, end, span 등 기존 문자열과 찾은 문자열간의 정보를 다양하게 제공함
re.compile(pattern, option) 을 사용하여 대소문자 무시, 여러 라인 매칭, 유니코드 처리 등 정규식에서 더 정교한 패턴 처리를 가능하게 할 수 있음
정규식에서 파일 경로 탐색등을 위해 백슬래시를 사용하고 싶다면, 문자열 앞에 r 을 붙여 raw string으로 사용하면 쉽게 이용할 수 있다
zerowidth 메타 문자 (문자열을 소비하지 않는 메타 문자)
| : or 로 사용 (EX. "cat|dog" 는 "cat", "dog" 모두 해당 )
^ : 문자열의 시작부분을 나타냄 (EX. "^ab" 는 "abc" 는 해당하지만 "cab" 는 해당하지 않음)
$ : 문자열의 마지막 부분을 나타냄 (EX. "ab$" 는 "cab" 는 해당하지만 "abc" 는 해당하지 않음)
\A, \Z : ^, $ 에 대응되어 문자열의 시작과 끝을 나타내지만, 멀티 라인에서도 사용이 가능하다는 차이가 있음
\b : 단어 경계를 나타냄. \b 앞이나 뒤의 문자열이 단어 문자가 아닌 경우에만 일치
\B : 단어 경계가 아닌 부분을 나타냄. \B 앞이나 뒤의 문자열이 단어 문자인 경우에만 일치
그루핑
() 를 사용하여 패턴이 일치하는 부분들을 그룹화하는 방법
그룹별로 추출하여 사용하거나, \1 등으로 첫번째 그룹을 재참조하는 등의 사용이 가능함
(?P<그룹이름>패턴) 형식으로 해당 그룹의 이름을 지정하여 사용할 수 있음
전방 탐색
일치하는 패턴의 앞이나 뒤에 위치한 문자열을 검색할 때 사용하는 방법
(?=패턴) 을 사용하여 해당 패턴이 나왔을 때, 앞이나 뒤의 문자열을 추출할 수 있음
(?!패턴) 을 사용하여 해당 패턴이 나오지 않았을 때, 앞이나 뒤의 문자열을 추출할 수 있음
문자열 바꾸기
re.sub(pattern, repl, string, count=0, flags=0) 을 사용하여 string에서 해당 패턴과 일치하는 부분을 repl로 count 개수만큼 바꿀 수 있음 (count=0인 경우 모두 바꾸기)
pattern 에서 그룹을 통해 값을 매칭했다면, repl 에서 \1, \2 로 해당 그룹을 가져와 변수처럼 사용할 수 있음
repl 에 lambda 함수를 사용하여 검색된 문자열을 어떻게 처리할 지 표현할 수 있음
Greedy vs Non-Greedy
정규식에서 Greedy 방식이란 해당 조건을 만족하는 최대 길이의 문자열을 탐색하는 것이고, Non-Greedy 방식이란 해당 조건을 만족하는 최소 길이의 문자열을 탐색하는 방법이다.
예를 들어, ".*" 은 0개 이상의 모든 문자열을 일치시켜 가장 긴 부분 문자열을 탐색하지만, ".*?" 은 0개 이상의 모든 문자열을 일치시키며 그 중 가장 짧은 부분 문자열을 탐색한다.