Suchen Sie den Index des letzten Auftretens eines Teilstrings in einer Zeichenfolge

347

Ich möchte die Position (oder den Index) des letzten Auftretens eines bestimmten Teilstrings in einer bestimmten Eingabezeichenfolge finden str.

Angenommen, die Eingabezeichenfolge ist str = 'hello'und die Teilzeichenfolge ist target = 'l', dann sollte sie 3 ausgeben.

Wie kann ich das machen?

Parth
quelle

Antworten:

600

Verwendung .rfind():

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

Verwenden strSie es auch nicht als Variablennamen, da Sie sonst den integrierten Namen beschatten str().

Rik Poggi
quelle
7
+1 für den Tipp, der nicht strals Variablenname verwendet werden soll. Ein anderer Variablenname, den Benutzer in Python vermeiden sollten, ist abc: abcIn der nativen API wird ein Modul aufgerufen .
Programmierer
80

Sie können rfind()oder Python2-Links verwenden: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

Der Unterschied ist , wenn der Teil nicht gefunden wird , rfind()kehrt -1während rindex()löst eine Ausnahme ValueError(Python2 Link: ValueError).

Wenn Sie den rfind()Rückkehrcode nicht überprüfen -1möchten rindex(), wird möglicherweise eine verständliche Fehlermeldung angezeigt . Andernfalls können Sie nach Minuten suchen, in denen der unerwartete Wert -1aus Ihrem Code stammt ...


Beispiel: Suche nach dem letzten Zeilenumbruchzeichen

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

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

>>> txt.rindex('\n')
22
olibre
quelle
Hallo @JacobSchneider. Ich habe ein Beispiel gemäß Ihrem Kommentar hinzugefügt. Ich verstehe Ihr Problem nicht. Bitte geben Sie weitere Informationen an: Python-Version, Inhalt Ihrer Zeichenfolge ... Cheers
olibre
39

Verwenden Sie die str.rindexMethode.

>>> 'hello'.rindex('l')
3
>>> 'hello'.index('l')
2
rmmh
quelle
5

Versuche dies:

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

Die more_itertoolsBibliothek bietet Tools zum Suchen von Indizes aller Zeichen oder aller Teilzeichenfolgen .

Gegeben

import more_itertools as mit


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

Code

Figuren

Jetzt ist das rlocateTool verfügbar:

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

Ein ergänzendes Werkzeug ist locate:

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

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

Teilzeichenfolgen

Es steht auch ein window_sizeParameter zum Auffinden des führenden Elements mehrerer Elemente zur Verfügung:

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
Pylang
quelle
2

Ich versuche nicht, einen inaktiven Beitrag wiederzubeleben, aber da dieser noch nicht veröffentlicht wurde ...

(So ​​habe ich es gemacht, bevor ich diese Frage gefunden habe)

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

Erläuterung: Wenn Sie nach dem letzten Vorkommen suchen, suchen Sie tatsächlich nach dem ersten Vorkommen in der umgekehrten Zeichenfolge. Da ich das wusste, tat ich es s[::-1](was eine umgekehrte Zeichenfolge zurückgibt) und indizierte dann die targetvon dort. Dann habe ich getan, len(s) - 1 - the index foundweil wir den Index in der nicht rückgängig gemachten wollen (dh ursprünglichen) Zeichenfolge haben wollen.

Aber aufgepasst! Wenn targetes sich um mehr als ein Zeichen handelt, werden Sie es wahrscheinlich nicht in der umgekehrten Zeichenfolge finden. Um dies zu beheben, verwenden Sie last_pos = len(s) - 1 - s[::-1].index(target[::-1]), das nach einer umgekehrten Version von sucht target.

Adi219
quelle
1
Ich habe diese Antwort positiv bewertet, weil sie zwar für die ursprüngliche Frage nicht allzu nützlich, aber im Allgemeinen interessant und lehrreich war. Ich denke, ein Großteil des Python-Lernens ist einfach so.
Bill Evans am
@ BillEvansatMariposa danke :)
Adi219
1

Wenn Sie rfind nicht verwenden möchten, reicht dies aus

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
Salam
quelle
0

Mit der rindex()Funktion können Sie das letzte Vorkommen eines Zeichens in einer Zeichenfolge abrufen

s="hellloooloo"
b='l'
print(s.rindex(b))
Praveen Kumar
quelle
0

Python String rindex () Methode

Beschreibung Die
Python-String-Methode rindex () gibt den letzten Index zurück, in dem der Teilstring str gefunden wurde, oder löst eine Ausnahme aus, wenn kein solcher Index vorhanden ist, und beschränkt die Suche optional auf string [beg: end].

Syntax
Es folgt die Syntax für die Methode rindex () -

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

Parameter
str - Dies gibt die zu durchsuchende Zeichenfolge an.

betteln - Dies ist der Startindex, standardmäßig seine 0

len - Dies ist der Endindex, der standardmäßig der Länge der Zeichenfolge entspricht.

Rückgabewert
Diese Methode gibt den letzten Index zurück, wenn er gefunden wird. Andernfalls wird eine Ausnahme ausgelöst, wenn str nicht gefunden wird.

Beispiel
Das folgende Beispiel zeigt die Verwendung der Methode rindex ().

Live-Demo

! / usr / bin / python

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

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

Wenn wir das obige Programm ausführen, wird folgendes Ergebnis erzielt:

5
2

Ref: Python String rindex () Methode - Tutorialspoint

Wise4Christ
quelle