Come ottenere la posizione di un personaggio in Python?


528

Come posso ottenere la posizione di un personaggio all'interno di una stringa in Python?

Risposte:


699

Esistono due metodi stringa per questo find()e index(). La differenza tra i due è ciò che accade quando la stringa di ricerca non viene trovata. find()ritorna -1 e index()rilancia ValueError.

utilizzando find()

>>> myString = 'Position of a character'
>>> myString.find('s')
2
>>> myString.find('x')
-1

utilizzando index()

>>> myString = 'Position of a character'
>>> myString.index('s')
2
>>> myString.index('x')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: substring not found

Dal manuale di Python

string.find(s, sub[, start[, end]])
Restituisce l'indice più basso s dove la sottostringa sub si trova in modo tale che sub è interamente contenuta in s[start:end]. Ritorno -1in caso di fallimento. I valori predefiniti per l' inizio e la fine e l'interpretazione dei valori negativi sono gli stessi delle sezioni.

E:

string.index(s, sub[, start[, end]])
Come find()ma aumentare ValueErrorquando la sottostringa non viene trovata.


127

Solo per completezza, se devi trovare tutte le posizioni di un personaggio in una stringa, puoi fare quanto segue:

s = 'shak#spea#e'
c = '#'
print [pos for pos, char in enumerate(s) if char == c]

che tornerà [4, 9]


4
In python3, ottengo un errore di sintassi: come dovrebbe essere modificato?
Sean,

19
@Sean: dichiarazione di stampa rimossa. Rimane solo il modulo di funzione. Irritante, ma la risposta è semplicemente quella di cambiare l'ultima riga in: print( [pos for pos, char in enumerate(s) if char == c])
The Nate,

3
foo = ( [pos for pos, char in enumerate(s) if char == c])metterà il coordinate foo in forma di elenco. Lo trovo davvero utile
3nrique0

è 0 indicizzato, 0123 rispetto a 1234, quindi la posizione attuale è 5, 10
3kstc

è il più veloce possibile? se uno usato np.arrays potrebbe esserci un guadagno in termini di prestazioni per le lunghe str?
Seb

49
>>> s="mystring"
>>> s.index("r")
4
>>> s.find("r")
4

Modo "Long winded"

>>> for i,c in enumerate(s):
...   if "r"==c: print i
...
4

per ottenere sottostringa,

>>> s="mystring"
>>> s[4:10]
'ring'

1
Grazie Dimmi come possiamo ottenere la sottostringa di una stringa in base alle posizioni indicate ...
user244470

1
@arung: per ottenere la sottostringa utilizzare lo slicing: str[from:to]dove frome tosono gli indici
Eli Bendersky,

s.find () restituisce -1 se la sottostringa non viene trovata
Evgenii,

s.search () genera un ValueError quando la sottostringa non viene trovata. s.find () restituisce -1 se la sottostringa non viene trovata.
Prassitele il

16

Solo per il completamento, nel caso in cui voglio trovare l'estensione in un nome di file per verificarlo, ho bisogno di trovare l'ultimo '.', In questo caso usa rfind:

path = 'toto.titi.tata..xls'
path.find('.')
4
path.rfind('.')
15

nel mio caso, utilizzo quanto segue, che funziona indipendentemente dal nome file completo:

filename_without_extension = complete_name[:complete_name.rfind('.')]

Questo è utile per trovare l'estensione di una stringa. Per esempio, trovare un dizionario potrebbe essere: left = q.find("{"); right = q.rfind("}").
ximiki,

15

Cosa succede quando la stringa contiene un carattere duplicato? dalla mia esperienza con index()ho visto che per i duplicati si ottiene lo stesso indice.

Per esempio:

s = 'abccde'
for c in s:
    print('%s, %d' % (c, s.index(c)))

ritornerebbe:

a, 0
b, 1
c, 2
c, 2
d, 4

In tal caso puoi fare qualcosa del genere:

for i, character in enumerate(my_string):
   # i is the position of the character in the string

enumerateè meglio per quel genere di cose.
o11c,

10
string.find(character)  
string.index(character)  

Forse ti piacerebbe dare un'occhiata alla documentazione per scoprire qual è la differenza tra i due.


Da quella documentazione collegata: s.search () genera un ValueError quando la sottostringa non viene trovata. s.find () restituisce -1 se la sottostringa non viene trovata.
Prassitele il

7

Un personaggio potrebbe apparire più volte in una stringa. Ad esempio in una stringa sentence, la posizione di eè 1, 4, 7(poiché l'indicizzazione di solito inizia da zero). ma quello che trovo sono entrambe le funzioni find()e index()restituisce la prima posizione di un personaggio. Quindi, questo può essere risolto facendo questo:

def charposition(string, char):
    pos = [] #list to store positions for each 'char' in 'string'
    for n in range(len(string)):
        if string[n] == char:
            pos.append(n)
    return pos

s = "sentence"
print(charposition(s, 'e')) 

#Output: [1, 4, 7]

1

more_itertools.locate è uno strumento di terze parti che trova tutte le indicazioni di articoli che soddisfano una condizione.

Qui troviamo tutte le posizioni di indice della lettera "i".

import more_itertools as mit


s = "supercalifragilisticexpialidocious"
list(mit.locate(s, lambda x: x == "i"))
# [8, 13, 15, 18, 23, 26, 30]

0

Una soluzione con numpy per un rapido accesso a tutti gli indici:

string_array = np.array(list(my_string))
char_indexes = np.where(string_array == 'C')

4
Per favore, non usare questo metodo. Non vi è alcun motivo per portare numpy in una semplice operazione di indicizzazione delle stringhe.
Mike Holler,
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.