문자열에서 특정 문자열이 있는 위치(Index)를 하나가 아닌, 문자열에 있는 모든 위치를 찾는 방법을 알아보겠습니다.

1. find()를 이용한 방법

text.find(substring)은 text라는 문자열에서 substring이라는 문자열의 위치를 왼쪽부터 찾고, 가장 먼저 찾은 문자열의 Index를 리턴합니다.

  • 찾는 문자열이 없으면 find()는 -1 리턴
  • 아래 예제에서 가장 먼저 찾은 “Python” 문자열은 Index 0의 “Python”이기 때문에 find()는 0 리턴
text = "Python is easy and Python is fun."
substring = "Python"

start = text.find(substring)
print(f"찾은 위치: {start}")

Output:

찾은 위치: 0

모든 문자열의 위치 찾기

위의 예제는 찾는 문자열이 여러개 있어도 하나의 위치만 리턴합니다. 문자열이 있는 모든 위치를 찾으려면 반복문을 사용하여 반복적으로 찾도록 구현해야 합니다.

text.find(substring, start)는 text에서 substring 문자열을 start 인덱스부터 찾습니다.

  • 아래와 같이 while문으로 반복적으로 모든 문자열의 위치를 찾을 수 있음
  • 문자열을 찾았다면, start 인덱스를 찾은 문자열 다음으로 변경하여 다음 문자열을 찾도록 해야 함
  • find()는 두개의 문자열을 찾고, 더 없어서 -1을 리턴하면서 반복문 종료
text = "Python is easy and Python is fun."
substring = "Python"

start = -1
while True:
    start = text.find(substring, start + 1)
    if start == -1:
        break
    print(f"찾은 위치: {start}")

Output:

찾은 위치: 0
찾은 위치: 19

2. 정규표현식을 이용한 방법

finditer(pattern, string)은 string에서 pattern에 해당하는 것을 모두 찾고, 결과를 Iterator로 리턴합니다.

  • Iterator를 for문으로 반복하여 match 값을 얻을 수 있음
  • 각각의 match는 일치하는 문자열 정보를 갖고 있으며, match.start()는 문자열의 시작 위치(Index) 리턴
  • 참고로, match.end()는 찾은 문자열의 마지막 Index를 리턴
import re

text = "Python is easy and Python is fun."
substring = "Python"

for match in re.finditer(substring, text):
    print("찾은 위치:", match.start())

Output:

찾은 위치: 0
찾은 위치: 19

3. index()를 이용한 방법

index()find()와 비슷하지만, 찾는 문자열이 없을 때 -1 대신 ValueError를 발생시킵니다.

  • index(substring, start)는 문자열의 start 인덱스부터 substring을 찾고, Index를 리턴
  • 찾는 문자열이 없으면 ValueError가 발생되며, 이것을 예외처리하여 반복문을 종료되도록 구현
text = "Python is easy and Python is fun."
substring = "Python"

start = -1
try:
    while True:
        start = text.index(substring, start + 1)
        print(f"찾은 위치: {start}")
except ValueError:
    pass

Output:

찾은 위치: 0
찾은 위치: 19