[python] 문자열에서 마지막 부분 문자열 색인 찾기

주어진 입력 문자열에서 특정 하위 문자열이 마지막으로 나타나는 위치 (또는 색인)를 찾고 싶습니다 str.

예를 들어 입력 문자열이 str = 'hello'이고 부분 문자열이이라고 가정하면 target = 'l'3을 출력해야합니다.

어떻게해야합니까?



답변

사용 .rfind():

>>> s = 'hello'
>>> s.rfind('l')
3

또한 str변수 이름으로 사용하지 않거나 내장을 음영 처리합니다 str().


답변

rfind()또는 Python2 링크를 사용할 수 있습니다 .rindex()
rfind() rindex()

>>> s = 'Hello StackOverflow Hi everybody'

>>> print( s.rfind('H') )
20

>>> print( s.rindex('H') )
20

>>> print( s.rfind('other') )
-1

>>> print( s.rindex('other') )
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: substring not found

차이점은 부분 문자열을 찾을 수 없을 때 예외를 발생 시키면서 rfind()리턴합니다 (Python2 link 🙂 .-1rindex()ValueErrorValueError

당신은 확인하지 않으려면 rfind()리턴 코드를 -1, 당신이 선호 할 수 있습니다 rindex()이해할 수있는 오류 메시지를 제공 할 것입니다. 그렇지 않으면 -1코드 내에서 예기치 않은 값 이 나오는 분을 검색 할 수 있습니다 …


예 : 마지막 개행 문자 검색

>>> txt = '''first line
... second line
... third line'''

>>> txt.rfind('\n')
22

>>> txt.rindex('\n')
22


답변

str.rindex방법을 사용하십시오 .

>>> 'hello'.rindex('l')
3
>>> 'hello'.index('l')
2


답변

이 시도:

s = 'hello plombier pantin'
print (s.find('p'))
6
print (s.index('p'))
6
print (s.rindex('p'))
15
print (s.rfind('p'))


답변

more_itertools모든 인덱스를 찾기위한 라이브러리 제공 도구 문자 또는 모든 문자열을 .

주어진

import more_itertools as mit


s = "hello"
pred = lambda x: x == "l"

암호

캐릭터

이제 rlocate사용 가능한 도구가 있습니다.

next(mit.rlocate(s, pred))
# 3

보완 도구는 locate다음과 같습니다.

list(mit.locate(s, pred))[-1]
# 3

mit.last(mit.locate(s, pred))
# 3

부분 문자열

window_size여러 항목의 선행 항목을 찾는 데 사용할 수 있는 매개 변수 도 있습니다.

s = "How much wood would a woodchuck chuck if a woodchuck could chuck wood?"
substring = "chuck"
pred = lambda *args: args == tuple(substring)

next(mit.rlocate(s, pred=pred, window_size=len(substring)))
# 59


답변

비활성 게시물을 부활 시키려고 시도하지 않았지만 아직 게시되지 않았기 때문에 …

(이 질문을 찾기 전에 내가 한 방법입니다)

s = "hello"
target = "l"
last_pos = len(s) - 1 - s[::-1].index(target)

설명 : 마지막 항목을 검색 할 때 실제로 반전 된 문자열에서 첫 번째 항목을 검색하는 것입니다. 이것을 알고, 나는 s[::-1](반전 된 문자열을 반환) 그 다음에서 색인을 생성 target했습니다. 그런 다음 반전되지 않은 (예 : 원래) 문자열 len(s) - 1 - the index found의 색인을 원하기 때문에 수행했습니다 .

그래도 조심하십시오! 경우 target더 하나 개의 문자보다, 당신은 아마 반전 된 문자열을 찾을 수 없습니다. 이 문제를 해결하려면 last_pos = len(s) - 1 - s[::-1].index(target[::-1])의 역 버전을 검색하는을 사용하십시오 target.


답변

rfind 를 사용하고 싶지 않다면 트릭 /

def find_last(s, t):
    last_pos = -1
    while True:
        pos = s.find(t, last_pos + 1)
        if pos == -1:
            return last_pos
        else:
            last_pos = pos