반응형
질문
파이썬에는 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
는 제너레이터를 반환하므로, 위의 []
를 ()
로 변경하여 결과를 한 번만 반복하는 경우에 더 효율적인 제너레이터를 얻을 수 있습니다.
반응형
댓글