문자열에서 특정 부분 문자열이 나타나는 모든 위치를 찾아야 할 때가 있습니다. 이럴 때 리스트 컴프리헨션(list comprehension)과 startswith() 메서드를 함께 사용하면 아주 간단하게 해결할 수 있습니다.
예제 코드
다음은 문자열 안에서 부분 문자열이 등장하는 모든 위치(인덱스)를 구하는 예제입니다.
my_string = "Python learn code test fun amazing object oriented"
sub_string = "object"
print("The string is : ")
print(my_string)
print("The sub-string is : ")
print(sub_string)
my_result = [index for index in range(len(my_string)) if my_string.startswith(sub_string, index)]
print("The resultant string is :")
print(my_result)실행 결과
The string is : Python learn code test fun amazing object oriented The sub-string is : object The resultant string is : [35]
코드 설명
먼저 하나의 문자열을 정의하고 콘솔에 출력합니다.
찾고자 하는 부분 문자열을 정의한 뒤, 역시 콘솔에 출력합니다.
리스트 컴프리헨션을 사용해 문자열의 길이만큼 인덱스를 하나씩 순회하면서, 해당 인덱스 위치에서 시작하는 부분이 지정한 부분 문자열과 일치하는지 검사합니다.
이 검사는
startswith()메서드로 수행됩니다. 이 메서드는 두 번째 인자로 검색을 시작할 인덱스를 받을 수 있어, 각 위치별 일치 여부를 확인하기에 적합합니다.조건을 만족하는 모든 인덱스 값은 새로운 리스트에 저장되어 결과 변수에 할당됩니다.
마지막으로 결과 리스트가 콘솔에 출력됩니다. 위 예제에서는 부분 문자열 "object"가 35번 인덱스에서 한 번만 등장하므로
[35]가 출력됩니다.
참고: 대체 방법
정규표현식을 선호한다면 re.finditer()를 사용해 동일한 결과를 얻을 수도 있습니다.
import re my_result = [m.start() for m in re.finditer(sub_string, my_string)] print(my_result) # [35]
두 방법 모두 시간 복잡도는 비슷하지만, 표준 라이브러리만으로 해결하고 싶다면 리스트 컴프리헨션과 startswith() 조합이 가장 파이썬다운 접근 방식입니다.