web-dev-qa-db-fra.com

Comment obtenir la position d'un personnage en Python?

Comment puis-je obtenir la position d'un caractère dans une chaîne en python?

473
user244470

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() renvoie -1 et index() soulève ValueError.

Utilisation de find()

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

Utilisation de 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

De la manuel Python

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

Et:

string.index(s, sub[, start[, end]])
Identique à find() mais soulève ValueError lorsque la sous-chaîne n’est pas trouvée.

617
Eli Bendersky

Par souci d’exhaustivité, si vous devez rechercher toutes les positions d’un caractère dans une chaîne, procédez comme suit:

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

qui retournera [4, 9]

107
Salvador Dali
>>> s="mystring"
>>> s.index("r")
4
>>> s.find("r")
4

Chemin "long"

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

obtenir une sous-chaîne,

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

Que se passe-t-il lorsque la chaîne contient un caractère en double? de mon expérience avec index() j'ai vu que pour dupliquer 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
15
DimSarak

Juste pour compléter, dans le cas où je souhaite trouver l’extension dans un nom de fichier afin de le vérifier, j’ai besoin de trouver le dernier '.', Dans ce cas, utilisez rfind:

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

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

filename_without_extension = complete_name[:complete_name.rfind('.')]
14
A.Joly
string.find(character)  
string.index(character)  

Peut-être aimeriez-vous jeter un œil à la documentation pour savoir quelle est la différence entre les deux.

11
John Machin

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

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]
4
itssubas

more_itertools.locate est un outil tiers qui trouve toutes les indications d'éléments 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]
_
0
pylang