검사가 끝나도 커서는 같은 자리에 있어
전후방 탐색은 조건을 확인한 뒤에도 엔진의 위치를 움직이지 않아. 이 비소비 성질 때문에 같은 위치에 여러 조건을 겹치거나, 검사에 사용한 문자와 본 매칭이 겹치게 만들 수 있어.
(?=A)(?=B)(?=C)는 같은 시작 위치에서 세 조건이 모두 맞아야 성공해. (?=cat)\w+는 cat가 시작하는지 먼저 확인한 뒤 \w+가 그 문자들을 실제로 소비해.
문자를 소비하는 패턴과 비교해
cat\d+는 cat를 소비한 다음 숫자를 찾지만, (?=cat)\d+는 c 위치에서 바로 숫자를 찾으려 하므로 실패해. (?=cat\d)cat\d+처럼 조건을 확인한 뒤 본 패턴이 같은 텍스트를 소비해야 해.
분할에서 경계 문자를 보존해
re.split(r'(?=[A-Z])', 'CamelCase')는 대문자 앞에서 나누되 대문자를 삭제하지 않아. 전방 탐색이 분할 위치만 찾고 경계 문자를 소비하지 않기 때문이야.