BANANA에서 ANA를 찾으면 두 번인데, 검색은 왜 한 번만 돌려줄까요? 글자 여섯 개를 따로 적고, 두 개의 작은 창으로 어디서부터 일치하는지 표시해 볼까요?
이번에는 대문자를 그대로 구별하고 글자를 바꾸지 않아요. 왼쪽부터 B·A·N·A·N·A에 1~6번을 붙여요. 세 글자 창이 들어갈 시작 번호는 6−3+1=4개, 즉 1·2·3·4입니다. 순서대로 읽으면 BAN·ANA·NAN·ANA이므로, ANA의 시작 번호 집합 M은 {2,4}입니다.
n(M)은 시작 번호의 개수예요. P₂와 P₄는 각 일치가 차지하는 글자 번호의 집합으로 쓸게요.
두 창은 4번 A를 함께 써요. 따라서 ‘모든 시작 위치를 표시하기’에는 두 점이 필요하지만, ‘겹치지 않는 일치만 왼쪽부터 뽑기’에는 두 창을 모두 넣을 수 없어요.
Python의 re.findall("ANA", "BANANA")는 두 번째 규칙이에요. 먼저 2~4번을 쓰고 나면 다음 검색은 5번 이후에서 시작해요. 거기에는 세 글자가 남지 않아 결과가 한 번이에요. 글자가 사라진 것이 아니라 셈의 조건이 달랐어요.
모든 시작점을 기록하려면 글자를 소비하지 않는 전방 탐색 (?=ANA)를 쓸 수 있어요. re.finditer의 각 결과에서 m.start()+1을 기록하면 종이 번호 2·4를 얻어요. 보통 문자 검색으로 돌아가면 한 번이에요. 작은 창을 겹쳐 놓을 것인지부터 정하고, 목적에 맞는 검색을 골라 볼까요?
착안: Python 공식 re 문서의 비중첩 검색과 전방 탐색 정의. 고정 단어와 글자칸 활동은 자체 사례이며, 알려진 기능·집합 계산을 새 정리로 주장하지 않아요.
