HOWTO · Python

Python에서 문자열의 문자 위치 찾기

Python 문자열에서 문자의 첫 번째, 마지막 또는 모든 인덱스를 찾고, 일치 항목이 없을 때 처리하는 방법을 알아봅니다.

이 페이지의 내용

Python 문자열의 인덱스는 0부터 시작합니다. 문자나 부분 문자열의 위치를 찾으려면 첫 번째 일치 항목에 find(), 마지막 일치 항목에 rfind()를 사용하고, 일치 항목이 없을 때 ValueError를 발생시키려면 index()를 사용합니다. find()와 rfind()는 일치 항목이 없으면 -1을 반환합니다. 일치하는 인덱스를 모두 모으려면 enumerate()로 문자열을 순회하면 됩니다. 아래 코드 예제는 제공된 Python 런타임에서 실행했으며, 각 절에 관찰된 결과를 설명합니다.

이 메서드들은 문자열을 검색하며 대소문자를 구분합니다. 검색할 값 외에 선택적으로 start와 end 경계를 지정할 수 있습니다. start 인덱스는 검색에 포함되고 end 인덱스는 포함되지 않습니다. 예를 들어 s.find("n", 6, 13)은 인덱스 6부터 12까지의 슬라이스를 검색합니다. 반환되는 값은 검색한 슬라이스 안에서의 상대 위치가 아니라 원래 문자열의 시작점을 기준으로 한 인덱스입니다.

find() 메서드로 첫 번째 일치 항목을 찾고 누락된 경우 처리하기

찾으려는 문자나 부분 문자열을 인수로 전달해 문자열에서 find()를 호출합니다. 이 메서드는 왼쪽에서 오른쪽으로 검색해 첫 번째 일치 항목의 인덱스를 반환합니다. 값이 문자열에 없으면 -1을 반환하므로, 그 값을 인덱스로 사용하기 전에 확인해야 합니다.

s = "python is fun"이고 c = "n"일 때 s.find(c)는 5를 반환합니다. 첫 번째 n은 0부터 세어 인덱스 5에 있습니다. 메서드의 일반적인 형식은 string.find(substring, start, end)이며, 선택적 경계를 생략하면 문자열 전체를 검색합니다.

첫 번째 일치 항목을 찾는 전체 예제입니다.

s = "python is fun"
c = "n"
print(s.find(c))

이 예제는 s의 시작부터 검색하며, 출력 결과는 5입니다. 일치 항목이 없을 수도 있다면 position = s.find(c)처럼 결과를 저장한 뒤 if position != -1: 조건으로 누락 여부를 명시적으로 처리할 수 있습니다.

rfind() 메서드로 마지막 일치 항목 찾기

문자나 부분 문자열의 마지막 출현 위치가 필요하면 rfind()를 사용합니다. 오른쪽에서 검색해 가장 큰 일치 인덱스를 반환하지만, 인덱스 자체는 여전히 문자열의 왼쪽부터 셉니다. find()와 마찬가지로 선택적인 start, end 경계를 받으며 일치 항목이 없으면 -1을 반환합니다.

같은 문자열과 문자를 사용하면 s.rfind(c)는 "python is fun"에서 마지막 n의 인덱스인 12를 반환합니다. 일반적인 형식은 string.rfind(substring, start, end)입니다.

s = "python is fun"
c = "n"
print(s.rfind(c))

이 예제의 결과는 12입니다. 가장 앞에 있는 일치 항목이 중요하면 find()를, 가장 뒤에 있는 일치 항목이 중요하면 rfind()를 선택하세요. 두 메서드 모두 검색 값이 없다는 이유만으로 오류를 발생시키지는 않습니다.

일치 항목이 없을 때 오류를 발생시키려면 index() 사용하기

index()도 첫 번째 일치 인덱스를 반환하며, 선택적인 start, end 경계를 받습니다. find()와 다른 점은 누락된 값의 처리 방식입니다. 문자나 부분 문자열이 없으면 -1을 반환하는 대신 ValueError를 발생시킵니다. 값이 없는 상황을 오류로 처리해야 한다면 index()를 사용하고, 반환값으로 누락 여부를 확인하려면 find()를 사용하세요.

s = "python is fun"이고 c = "n"일 때 s.index(c)는 5를 반환합니다. 일반적인 형식은 string.index(substring, start, end)입니다.

s = "python is fun"
c = "n"
print(s.index(c))

이 예제는 첫 번째 n을 검색하므로 결과는 5입니다. index()가 누락된 경우 ValueError를 반환한다고 설명하면 안 됩니다. 이 메서드는 해당 예외를 발생시키며, 필요하다면 호출하는 쪽에서 try/except 문으로 처리할 수 있습니다.

for 루프와 enumerate()로 일치하는 인덱스 모두 찾기

find(), rfind(), index()는 각각 일치하는 인덱스 하나를 반환합니다. 모든 출현 위치를 찾으려면 enumerate()로 문자열을 순회하세요. enumerate()는 각 문자와 그 문자의 0부터 시작하는 인덱스를 함께 제공합니다. 검색하는 값과 문자가 일치할 때마다 해당 인덱스를 추가하면 됩니다.

s = "python is fun"
c = "n"
lst = []
for pos, char in enumerate(s):
    if char == c:
        lst.append(pos)
print(lst)

이 문자열에서 일치하는 인덱스는 [5, 12]입니다. 두 n 문자가 각각 인덱스 5와 12에 있기 때문입니다. 같은 결과를 인라인 리스트 컴프리헨션인 [pos for pos, char in enumerate(s) if char == c]로도 표현할 수 있습니다. 별도의 루프 본문이 필요하지 않을 때 순회와 일치 조건을 한곳에 모을 수 있습니다.

두 방식 모두 문자를 순서대로 살펴보며 동일한 0 기반 인덱스를 사용합니다. 각 일치 항목마다 추가 작업을 하려면 루프를 선택하고, 일치하는 인덱스를 모으는 것이 전부라면 리스트 컴프리헨션을 선택하세요.