Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python – 리스트 컴프리헨션과 startswith()로 문자열 내 부분 문자열의 모든 위치 찾기

문자열에서 특정 부분 문자열이 나타나는 모든 위치를 찾아야 할 때가 있습니다. 이럴 때 리스트 컴프리헨션(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() 조합이 가장 파이썬다운 접근 방식입니다.