HOWTO · Python

Come trovare un carattere in una stringa in Python

Scopri come trovare l'indice di un carattere o di una sottostringa in una stringa Python e come gestire le occorrenze mancanti.

In questa pagina

Gli indici delle stringhe Python iniziano da 0. Per trovare un carattere o una sottostringa, usa find() per la prima occorrenza, rfind() per l’ultima oppure index() se vuoi che l’assenza provochi un errore ValueError. Se non trova corrispondenze, find() e rfind() restituiscono -1. Per raccogliere tutti gli indici corrispondenti, puoi iterare con enumerate(). Gli esempi di codice qui sotto sono stati eseguiti nel runtime Python fornito; i risultati osservati sono riportati nelle rispettive sezioni.

Questi metodi cercano all’interno delle stringhe e distinguono tra maiuscole e minuscole. Ognuno accetta il valore da cercare e i limiti facoltativi start ed end: start è incluso, mentre end è escluso. Per esempio, s.find("n", 6, 13) cerca solo nella porzione che va dall’indice 6 all’indice 12. L’indice restituito è riferito alla stringa originale, non alla porzione esaminata.

Usare il metodo find() per trovare la prima corrispondenza e gestire un risultato assente

Chiama find() sulla stringa e passagli il carattere o la sottostringa da cercare. Il metodo restituisce l’indice della prima corrispondenza, partendo da sinistra. Se il valore non è presente, restituisce -1; controlla quindi questo risultato prima di usare l’indice.

Con s = "python is fun" e c = "n", s.find(c) restituisce 5: la prima n si trova all’indice zero-based 5. La forma generale del metodo è string.find(substring, start, end); ometti i limiti facoltativi per cercare nell’intera stringa.

Ecco un esempio completo per trovare la prima corrispondenza:

s = "python is fun"
c = "n"
print(s.find(c))

L’esempio cerca dall’inizio di s e stampa 5. Se la ricerca può non trovare corrispondenze, puoi gestire esplicitamente il caso assegnando il risultato, per esempio con position = s.find(c), e verificando poi if position != -1:.

Usare il metodo rfind() per trovare l’ultima corrispondenza

Usa rfind() quando ti serve l’ultima occorrenza di un carattere o di una sottostringa. La ricerca procede da destra e il metodo restituisce l’indice corrispondente più alto, anche se l’indice viene sempre contato da sinistra. Come find(), accetta i limiti facoltativi start ed end e restituisce -1 se non trova corrispondenze.

Con la stessa stringa e lo stesso carattere, s.rfind(c) restituisce 12, l’indice dell’ultima n in "python is fun". La forma generale è string.rfind(substring, start, end).

s = "python is fun"
c = "n"
print(s.rfind(c))

In questo caso il risultato è 12. Scegli find() se ti interessa la prima corrispondenza e rfind() se ti interessa l’ultima; nessuno dei due metodi genera un errore solo perché il valore cercato è assente.

Usare il metodo index() quando l’assenza deve generare un errore

Anche index() restituisce l’indice della prima corrispondenza e accetta gli stessi limiti facoltativi start ed end. La differenza principale rispetto a find() riguarda il caso in cui non ci sia una corrispondenza: se il carattere o la sottostringa non è presente, index() solleva ValueError invece di restituire -1. Usalo quando l’assenza deve essere trattata come un errore; scegli find() se preferisci rilevarla controllando il valore restituito.

Con s = "python is fun" e c = "n", s.index(c) restituisce 5. La forma generale è string.index(substring, start, end).

s = "python is fun"
c = "n"
print(s.index(c))

L’esempio cerca la prima n e quindi restituisce 5. Non dire che, in caso di assenza, index() restituisce ValueError: il metodo solleva quell’eccezione. Se necessario, il codice chiamante può gestirla con un blocco try/except.

Usare un ciclo for con enumerate() per trovare tutti gli indici corrispondenti

find(), rfind() e index() restituiscono un solo indice corrispondente ciascuno. Per trovare tutte le occorrenze, scorri la stringa con enumerate(), che associa ogni carattere al suo indice zero-based. Aggiungi l’indice ogni volta che il carattere corrisponde al valore cercato.

s = "python is fun"
c = "n"
lst = []
for pos, char in enumerate(s):
    if char == c:
        lst.append(pos)
print(lst)

In questa stringa, gli indici corrispondenti sono [5, 12]: le due n si trovano agli indici 5 e 12. Lo stesso risultato si può ottenere con la forma compatta di una list comprehension: [pos for pos, char in enumerate(s) if char == c]. In questo modo, l’iterazione e la condizione di corrispondenza restano insieme quando non serve un corpo del ciclo separato.

Entrambi gli approcci esaminano i caratteri in ordine e usano gli stessi indici zero-based. Scegli il ciclo se vuoi eseguire altre operazioni per ogni corrispondenza; usa la list comprehension quando devi solo raccogliere gli indici corrispondenti.