Comment obtenir la position d'un personnage en Python?

528

Comment puis-je obtenir la position d'un caractère à l'intérieur d'une chaîne en python?

user244470
la source

Réponses:

699

Il existe deux méthodes de chaîne pour cela, find()et index(). La différence entre les deux est ce qui se passe lorsque la chaîne de recherche n'est pas trouvée. find()revient -1 et index()relance ValueError.

En utilisant find()

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

En utilisant 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

Depuis le manuel Python

string.find(s, sub[, start[, end]])
Renvoie l'indice le plus bas de s où la sous-chaîne sub se trouve telle que sub est entièrement contenu dans s[start:end]. Retour -1en cas d'échec. Les valeurs par défaut pour le début et la fin et l'interprétation des valeurs négatives sont les mêmes que pour les tranches.

Et:

string.index(s, sub[, start[, end]])
Comme find()mais soulève ValueErrorquand la sous-chaîne n'est pas trouvée.

Eli Bendersky
la source
127

Dans un souci d'exhaustivité, si vous avez besoin de trouver toutes les positions d'un caractère dans une chaîne, vous pouvez effectuer les opérations suivantes:

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

qui reviendra [4, 9]

Salvador Dali
la source
4
En python3, j'obtiens une erreur de syntaxe - comment cela devrait-il être modifié?
Sean
19
@Sean: l'instruction d'impression a été supprimée. Seule la forme de fonction reste. Irritant, mais la réponse est simplement de changer cette dernière ligne en: 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])mettra les coordonnées foo dans un format de liste. Je trouve cela vraiment utile
3nrique0
c'est 0 indexé, 0123 par opposition à 1234, donc la position réelle est 5, 10
3kstc
est-ce aussi rapide que possible? si l'on utilisait np.arrays, y aurait-il un gain de performances pour les longues str?
Seb
49
>>> s="mystring"
>>> s.index("r")
4
>>> s.find("r")
4

Chemin "de longue haleine"

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

pour obtenir une sous-chaîne,

>>> s="mystring"
>>> s[4:10]
'ring'
ghostdog74
la source
1
Merci Dites-moi comment pouvons-nous obtenir la sous-chaîne d'une chaîne en fonction des positions données ...
user244470
1
@arung: pour obtenir le découpage de l'utilisation de la sous-chaîne: str[from:to]fromet tosont les indices
Eli Bendersky
s.find () renvoie -1 si la sous-chaîne n'est pas trouvée
Evgenii
s.search () déclenche une ValueError lorsque la sous-chaîne n'est pas trouvée. s.find () renvoie -1 si la sous-chaîne n'est pas trouvée.
Praxiteles
16

Juste pour terminer, dans le cas où je veux trouver l'extension dans un nom de fichier afin de le vérifier, je dois trouver le dernier '.', Dans ce cas, utilisez rfind:

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

dans mon cas, j'utilise ce qui suit, qui fonctionne quel que soit le nom de fichier complet:

filename_without_extension = complete_name[:complete_name.rfind('.')]
A.Joly
la source
Cela est utile pour trouver l'étendue d'une chaîne. Par exemple, trouver un dictionnaire pourrait être: left = q.find("{"); right = q.rfind("}").
ximiki
15

Que se passe-t-il lorsque la chaîne contient un caractère en double? d'après mon expérience, index()j'ai vu que pour les doublons, vous récupérez le même index.

Par exemple:

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

retournerais:

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

Dans ce cas, vous pouvez faire quelque chose comme ça:

for i, character in enumerate(my_string):
   # i is the position of the character in the string
DimSarak
la source
enumerateest mieux pour ce genre de chose.
o11c
10
string.find(character)  
string.index(character)  

Vous aimeriez peut-être jeter un œil à la documentation pour découvrir quelle est la différence entre les deux.

John Machin
la source
À partir de cette documentation liée: s.search () déclenche une ValueError lorsque la sous-chaîne n'est pas trouvée. s.find () renvoie -1 si la sous-chaîne n'est pas trouvée.
Praxiteles
7

Un caractère peut apparaître plusieurs fois dans une chaîne. Par exemple, dans une chaîne sentence, la position de eest 1, 4, 7(car l'indexation commence généralement à zéro). mais ce que je trouve est à la fois des fonctions find()et index()renvoie la première position d'un caractère. Donc, cela peut être résolu en faisant ceci:

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]
itssubas
la source
1

more_itertools.locate est un outil tiers qui trouve tous les indices d'articles qui remplissent une condition.

Ici, nous trouvons tous les emplacements d'index de la lettre "i".

import more_itertools as mit


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

Une solution avec numpy pour un accès rapide à tous les index:

string_array = np.array(list(my_string))
char_indexes = np.where(string_array == 'C')
Seb
la source
4
Veuillez ne pas utiliser cette méthode. Il n'y a aucune raison d'intégrer numpy dans une opération d'indexation de chaîne simple.
Mike Holler