파이썬에서 문자열 안에 n번째로 등장하는 부분 문자열의 위치를 찾으려면 split() 메서드에 최대 분할 횟수(maxsplit)를 n+1로 지정해 문자열을 나누는 방법을 활용할 수 있습니다. 분할 결과로 얻은 리스트의 길이가 n+1보다 작거나 같다면, 해당 부분 문자열이 n번 이상 등장하지 않았다는 의미이므로 -1을 반환하면 됩니다.
부분 문자열이 충분히 존재한다면, 인덱스는 아래의 간단한 공식으로 계산할 수 있습니다.
인덱스 = 원본 문자열 길이 − 마지막 분할 조각의 길이 − 부분 문자열 길이
예제
def findnth(string, substring, n):
parts = string.split(substring, n + 1)
if len(parts) <= n + 1:
return -1
return len(string) - len(parts[-1]) - len(substring)
findnth('foobarfobar akfjfoobar afskjdf foobar', 'foobar', 2)출력
위 코드를 실행하면 다음과 같은 결과가 출력됩니다:
31
동작 원리
string.split(substring, n + 1)은 부분 문자열을 기준으로 최대 n+1번만 문자열을 나눕니다. 따라서 마지막 조각 바로 앞까지 정확히 n개의 부분 문자열이 처리되며, 마지막 조각의 시작 지점이 곧 n번째 부분 문자열이 끝난 직후의 위치가 됩니다. 여기서 마지막 조각의 길이와 부분 문자열의 길이를 빼면 n번째 부분 문자열의 시작 인덱스를 구할 수 있습니다.
참고로 위 예제에서 매개변수 n은 0부터 시작합니다. 만약 첫 번째 발생을 1로 세고 싶다면 함수 내부에서 n-1을 사용하거나 호출 시 n-1을 전달하는 방식으로 손쉽게 변경할 수 있습니다.