본문 바로가기
Python/Python FAQ

Python 서브스트링의 모든 발생을 찾는 방법은 무엇인가요?, How to find all occurrences of a substring?

by 베타코드 2023. 9. 16.
반응형

질문


파이썬에는 string.find()string.rfind()가 있어 문자열에서 부분 문자열의 인덱스를 가져올 수 있습니다.

string.find_all()과 같이 모든 찾은 인덱스를 반환할 수 있는 함수가 있는지 궁금합니다 (시작부터 첫 번째 또는 끝에서 첫 번째만 반환하는 것이 아니라).

예를 들어:

string = "test test test test"

print string.find('test') # 0
print string.rfind('test') # 15

# 이게 목표입니다
print string.find_all('test') # [0,5,10,15]

발생 횟수를 계산하려면 문자열에서 부분 문자열의 발생 횟수 세기를 참조하세요.


답변


원하는 기능을 수행하는 간단한 내장 문자열 함수는 없지만, 더 강력한 정규 표현식을 사용할 수 있습니다: 정규 표현식을 사용할 수 있습니다:

import re
[m.start() for m in re.finditer('test', 'test test test test')]
#[0, 5, 10, 15]

만약 겹치는 일치 항목을 찾고 싶다면, 전방 탐색을 사용할 수 있습니다:

[m.start() for m in re.finditer('(?=tt)', 'ttt')]
#[0, 1]

겹치지 않는 모든 항목을 역순으로 찾고 싶다면, 양의 전방 탐색과 부정적 전방 탐색을 결합한 다음과 같은 표현식을 사용할 수 있습니다:

search = 'tt'
[m.start() for m in re.finditer('(?=%s)(?!.{1,%d}%s)' % (search, len(search)-1, search), 'ttt')]
#[1]

re.finditer제너레이터를 반환하므로, 위의 []()로 변경하여 결과를 한 번만 반복하는 경우에 더 효율적인 제너레이터를 얻을 수 있습니다.

반응형

댓글