HOWTO · Python
Trouver tous les index d'un caractère dans une chaîne Python
Nous pouvons utiliser des expressions régulières, le mot-clé yield et des compréhensions de liste pour trouver tous les index d'un caractère à l'intérieur d'une chaîne en Python.
Sur cette page
Pour trouver toutes les occurrences d’un caractère dans une chaîne Python, associez enumerate() à une condition et rassemblez les indices correspondants. Les indices Python commencent à 0 : le premier caractère se trouve donc à l’indice 0. Les exemples ci-dessous utilisent la chaîne "This is a string" et recherchent le "i" minuscule.
Trouver tous les indices de caractères avec enumerate() et une compréhension de liste
Pour une chaîne et un caractère cible, cette compréhension de liste renvoie, dans l’ordre, tous les indices correspondants. Exécutez cet exemple :
Le code et les libellés ou sorties affichés dans cette section restent en anglais.
string = "This is a string"
char = "i"
indices = [index for index, character in enumerate(string) if character == char]
print(indices)
enumerate(string) fournit une paire pour chaque caractère : son indice et sa valeur. La condition ne conserve un indice que lorsque cette valeur est égale à char, puis la compréhension de liste rassemble les indices dans une nouvelle liste. Avec l’entrée de l’exemple, les positions correspondantes sont 2, 5 et 13. La recherche respecte la casse : rechercher "I" ne trouverait pas le "i" minuscule. Si le caractère cible est absent, le résultat est []. Cette méthode est généralement la plus claire lorsque le programme appelant a besoin de tous les indices à la fois.
Générer les indices correspondants à la demande avec yield
Un générateur est utile lorsque les résultats doivent être consommés un par un ou lorsque l’entrée est volumineuse. La fonction ci-dessous effectue les mêmes comparaisons et conserve le même ordre que la compréhension de liste, mais elle fournit chaque indice au fil de l’itération.
Le code et les libellés ou sorties affichés dans cette section restent en anglais.
def find_indexes(string, char):
for index, character in enumerate(string):
if character == char:
yield index
string = "This is a string"
char = "i"
indices = list(find_indexes(string, char))
print(indices)
L’appel find_indexes(string, char) crée un générateur ; le corps de la fonction s’exécute à mesure que des valeurs sont demandées. Utilisez une boucle for pour traiter les indices au fur et à mesure, ou enveloppez l’appel dans list(...) si vous avez besoin de la liste complète. La matérialisation du générateur donne les mêmes indices que la compréhension de liste. En l’absence de correspondance, l’itération ne produit aucune valeur et list(...) renvoie []. Le mot-clé yield suspend la fonction lorsqu’elle transmet une valeur à son appelant, puis reprend à l’itération suivante.
Trouver tous les indices de caractères avec des expressions régulières
Pour les trois méthodes de cet article, char doit être une chaîne Python d’un seul caractère. Cette hypothèse commune permet de conserver la même logique entre les comparaisons caractère par caractère et l’exemple avec une expression régulière. Utilisez re.finditer() lorsque la recherche se décrit naturellement à l’aide d’un motif d’expression régulière. Chaque objet de correspondance fournit sa position de départ avec start(). Lorsque la cible est un caractère littéral fourni comme donnée, transmettez-le à re.escape() ; sinon, des caractères comme ., * ou [ peuvent être interprétés comme de la syntaxe d’expression régulière au lieu d’être recherchés littéralement.
Le code et les libellés ou sorties affichés dans cette section restent en anglais.
import re
string = "This is a string"
char = "i"
pattern = re.escape(char)
indices = [match.start() for match in re.finditer(pattern, string)]
print(indices)
[2, 5, 13]
L’échappement est important pour une cible littérale, surtout si elle peut contenir des métacaractères d’expression régulière. Si vous souhaitez délibérément utiliser un motif, transmettez-le directement à re.finditer() sans l’échapper. Pour un seul caractère littéral, enumerate() est plus simple ; les expressions régulières sont surtout utiles lorsque la règle de correspondance nécessite des fonctionnalités de motif. Les trois méthodes parcourent la chaîne de gauche à droite, conservent les occurrences répétées et renvoient des positions commençant à zéro.