Trova l'indice dell'ultima occorrenza di una sottostringa in una stringa


350

Voglio trovare la posizione (o l'indice) dell'ultima occorrenza di una determinata sottostringa in una determinata stringa di input str.

Ad esempio, supponiamo che la stringa di input sia str = 'hello'e la sottostringa sia target = 'l', quindi dovrebbe produrre 3.

Come posso fare questo?

Risposte:


604

Utilizzare .rfind():

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

Inoltre, non utilizzare strcome nome di variabile o ombreggerai il built-in str().


8
+1 per il suggerimento da non utilizzare strcome nome variabile. Un altro nome di variabile che le persone dovrebbero evitare in Python è abc; c'è un modulo chiamato abcnell'API nativa.
progyammer,

81

Puoi usare i collegamentirfind() o 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

La differenza è quando la sottostringa non viene trovata, rfind()ritorna -1mentre rindex()solleva un'eccezione ValueError(collegamento Python2:) ValueError.

Se non si desidera controllare il rfind()codice di ritorno -1, si potrebbe preferire rindex()che fornirà un messaggio di errore comprensibile. Altrimenti puoi cercare minuti in cui il valore imprevisto -1proviene dal tuo codice ...


Esempio: ricerca dell'ultimo carattere di nuova riga

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

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

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

Ciao @JacobSchneider. Ho aggiunto un esempio in base al tuo commento. Non capisco il tuo problema. Per favore fornisci maggiori informazioni: Versione Python, Contenuto della tua stringa ... Saluti
olibre

39

Usa il str.rindexmetodo

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

5

Prova questo:

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

3

La more_itertoolslibreria offre strumenti per la ricerca di indici di tutti i caratteri o di tutte le sottostringhe .

Dato

import more_itertools as mit


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

Codice

Personaggi

Ora c'è lo rlocatestrumento disponibile:

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

Uno strumento complementare è locate:

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

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

sottostringhe

È inoltre window_sizedisponibile un parametro per individuare l'elemento principale di diversi elementi:

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

Non provo a resuscitare un post inattivo, ma dal momento che questo non è stato ancora pubblicato ...

(È così che ho fatto prima di trovare questa domanda)

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

Spiegazione: Quando stai cercando l'ultima occorrenza, in realtà stai cercando la prima occorrenza nella stringa invertita. Sapendo questo, l'ho fatto s[::-1](che restituisce una stringa invertita), e quindi ho indicizzato il targetda lì. Poi l'ho fatto len(s) - 1 - the index foundperché vogliamo l'indice nella stringa non convertita (cioè originale).

Attenzione però! Se targetè più di un carattere, probabilmente non lo troverai nella stringa invertita. Per risolvere questo problema, utilizzare last_pos = len(s) - 1 - s[::-1].index(target[::-1]), che cerca una versione inversa di target.


1
Ho votato a favore di questa risposta perché, sebbene non fosse troppo utile per la domanda originale, era interessante ed educativa in generale. Penso che gran parte dell'apprendimento di Python sia proprio così.
Bill Evans a Mariposa il

1

Se non vuoi usare rfind, questo farà il trucco /

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

puoi usare la rindex()funzione per ottenere l'ultima occorrenza di un carattere nella stringa

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

0

Metodo Python String rindex ()

Descrizione
Metodo stringa Python rindex () restituisce l'ultimo indice in cui si trova la sottostringa str o genera un'eccezione se tale indice non esiste, limitando facoltativamente la ricerca alla stringa [beg: end].

Sintassi Di
seguito è riportata la sintassi del metodo rindex () -

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

parametri
str: specifica la stringa da cercare.

beg - Questo è l'indice iniziale, per impostazione predefinita è 0

len - Questo sta terminando l'indice, per impostazione predefinita è uguale alla lunghezza della stringa.

Valore di ritorno
Questo metodo restituisce l'ultimo indice se trovato, altrimenti genera un'eccezione se str non viene trovato.

Esempio
L'esempio seguente mostra l'uso del metodo rindex ().

Dimostrazione dal vivo

! / Usr / bin / python

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

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

Quando eseguiamo il programma sopra, produce il seguente risultato -

5
2

Rif: Python String rindex () Metodo - Tutorialspoint

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.