Znajdź indeks ostatniego wystąpienia podłańcucha w ciągu


349

Chcę znaleźć pozycję (lub indeks) ostatniego wystąpienia określonego podłańcucha w danym ciągu wejściowym str.

Załóżmy na przykład, że łańcuch wejściowy jest, str = 'hello'a podłańcuch jest target = 'l', to powinien dać wynik 3.

W jaki sposób mogę to zrobić?

Odpowiedzi:


601

Użyj .rfind():

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

Nie używaj również strjako nazwy zmiennej, w przeciwnym razie ukryjesz wbudowaną funkcję str().


7
+1 za wskazówkę, której nie należy używać strjako nazwy zmiennej. Inną nazwą zmiennej, której ludzie powinni unikać w pythonie, jest abc; abcw natywnym API jest moduł o nazwie
programista

81

Można użyć rfind()albo python2 linki: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

Różnica polega na tym, że nie można znaleźć podciągu, rfind()zwraca -1podczas zgłaszania rindex()wyjątku ValueError(łącze Python2:) ValueError.

Jeśli nie chcesz sprawdzać rfind()kodu powrotu -1, możesz preferować rindex()dostarczenie zrozumiałego komunikatu o błędzie. W przeciwnym razie możesz wyszukać minuty, w których nieoczekiwana wartość -1pochodzi z Twojego kodu ...


Przykład: Wyszukiwanie ostatniego znaku nowej linii

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

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

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

Cześć @JacobSchneider. Dodałem przykład według twojego komentarza. Nie rozumiem twojego problemu. Podaj więcej informacji: Wersja Python, Treść łańcucha ... Pozdrawiam
olibre

39

Skorzystaj z str.rindexmetody

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

5

Spróbuj tego:

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

3

Do more_itertoolsoferty biblioteki narzędzia do znajdowania indeksów wszystkich znaków lub wszystkich podciągów .

Dany

import more_itertools as mit


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

Kod

Postacie

Teraz dostępne jest rlocatenarzędzie:

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

Uzupełniającym narzędziem jest locate:

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

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

Podciągi

Dostępny jest również window_sizeparametr umożliwiający zlokalizowanie wiodącego elementu kilku przedmiotów:

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

2

Nie próbuję wskrzesić nieaktywnego posta, ale ponieważ nie został on jeszcze opublikowany ...

(Tak to zrobiłem przed znalezieniem tego pytania)

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

Objaśnienie: Gdy szukasz ostatniego wystąpienia, tak naprawdę szukasz pierwszego wystąpienia w odwróconym ciągu. Wiedząc o tym, zrobiłem s[::-1](co zwraca odwrócony ciąg), a następnie zindeksowałem targetstamtąd. Potem zrobiłem, len(s) - 1 - the index foundponieważ chcemy indeks w nieodwróconym (tj. Oryginalnym) ciągu.

Uważaj jednak! Jeśli targetjest więcej niż jeden znak, prawdopodobnie nie znajdziesz go w odwróconym ciągu. Aby to naprawić, użyj last_pos = len(s) - 1 - s[::-1].index(target[::-1]), który szuka odwróconej wersji target.


1
Poparłem tę odpowiedź, ponieważ, choć nie była zbyt przydatna w pierwotnym pytaniu, była ogólnie interesująca i edukacyjna. Myślę, że duża część nauki języka Python jest właśnie taka.
Bill Evans w Mariposa

1

Jeśli nie chcesz używać rfind, to załatwi sprawę /

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

0

możesz użyć rindex()funkcji, aby uzyskać ostatnie wystąpienie znaku w ciągu

s="hellloooloo"
b='l'
print(s.rindex(b))

0

Metoda rindex () w języku Python String

Opis
Metoda ciągu znaków w Pythonie rindex () zwraca ostatni indeks, w którym znaleziono ciąg podłańcucha, lub zgłasza wyjątek, jeśli taki indeks nie istnieje, opcjonalnie ograniczając wyszukiwanie do łańcucha [beg: end].

Składnia
Poniżej znajduje się składnia metody rindex () -

str.rindex(str, beg=0 end=len(string))

Parametry
str - określa ciąg do przeszukania.

beg - jest to indeks początkowy, domyślnie jego wartość 0

len - jest to indeks kończący, domyślnie jest równy długości łańcucha.

Zwracana wartość
Ta metoda zwraca ostatni indeks, jeśli zostanie znaleziony, w przeciwnym razie generuje wyjątek, jeśli nie zostanie znaleziony str.

Przykład
Poniższy przykład ilustruje użycie metody rindex ().

Demo na żywo

! / usr / bin / python

str1 = "this is string example....wow!!!";
str2 = "is";

print str1.rindex(str2)
print str1.index(str2)

Gdy uruchomimy program powyżej, generuje następujący wynik -

5
2

Ref: Python String rindex () Metoda - Tutorialspoint

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.