Comment puis-je obtenir la position d'un caractère à l'intérieur d'une chaîne en python?
Comment puis-je obtenir la position d'un caractère à l'intérieur d'une chaîne en python?
Réponses:
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
.
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]])
Renvoie l'indice le plus bas de s où la sous-chaîne sub se trouve telle que sub est entièrement contenu danss[start:end]
. Retour-1
en 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]])
Commefind()
mais soulèveValueError
quand la sous-chaîne n'est pas trouvée.
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]
print( [pos for pos, char in enumerate(s) if char == c])
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
>>> 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'
str[from:to]
où from
et to
sont les indices
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('.')]
left = q.find("{"); right = q.rfind("}")
.
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
enumerate
est mieux pour ce genre de chose.
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.
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 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]
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]
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')