Come posso ottenere la posizione di un personaggio all'interno di una stringa in Python?
Come posso ottenere la posizione di un personaggio all'interno di una stringa in Python?
Risposte:
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
.
find()
>>> myString = 'Position of a character'
>>> myString.find('s')
2
>>> myString.find('x')
-1
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
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 ins[start:end]
. Ritorno-1
in 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]])
Comefind()
ma aumentareValueError
quando la sottostringa non viene trovata.
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]
print( [pos for pos, char in enumerate(s) if char == c])
foo = ( [pos for pos, char in enumerate(s) if char == c])
metterà il coordinate foo in forma di elenco. Lo trovo davvero utile
>>> 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'
str[from:to]
dove from
e to
sono gli indici
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('.')]
left = q.find("{"); right = q.rfind("}")
.
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.
string.find(character)
string.index(character)
Forse ti piacerebbe dare un'occhiata alla documentazione per scoprire qual è la differenza tra i due.
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]
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]
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')