Rechercher une sous-chaîne avec find() et rfind() en Python

1. À propos de find() et rfind() en Python

Python propose les méthodes find() et rfind() pour rechercher une sous-chaîne à l'intérieur d'une chaîne de caractères. Ces méthodes renvoient la position, c'est-à-dire l'indice, où commence la sous-chaîne recherchée.

La méthode find() recherche la première occurrence de la sous-chaîne en parcourant la chaîne de gauche à droite. La méthode rfind() recherche la dernière occurrence.

Dans l'exemple suivant, le mot "Python" commence à l'indice 10.

Sortie :

Comme les indices Python commencent à 0, le premier caractère d'une chaîne possède l'indice 0, le deuxième l'indice 1, et ainsi de suite.

2. Rechercher une sous-chaîne avec find()

La méthode find() recherche la première occurrence d'une sous-chaîne et renvoie l'indice de son premier caractère.

Dans cet exemple, "Python" apparaît une seule fois et commence à l'indice 3.

Sortie :

Si la sous-chaîne apparaît plusieurs fois, find() renvoie uniquement la position de sa première occurrence.

Sortie :

find() peut rechercher un seul caractère de la même manière qu'une sous-chaîne contenant plusieurs caractères.

Sortie :

3. Comprendre la valeur -1 retournée par find()

Lorsque la sous-chaîne recherchée n'existe pas, find() ne provoque pas d'erreur. Elle renvoie la valeur -1.

Dans l'exemple suivant, "Java" n'apparaît pas dans la chaîne.

Sortie :

Cette propriété permet d'utiliser find() dans une condition pour déterminer si une sous-chaîne a été trouvée.

Sortie :

Il faut éviter de tester directement le résultat avec une condition comme if texte.find("Python"), car l'indice 0 correspond à une occurrence valide mais la valeur 0 est considérée comme fausse dans un contexte booléen.

Le programme suivant illustre ce cas particulier.

Sortie :

4. Rechercher depuis la droite avec rfind()

La méthode rfind() recherche la dernière occurrence d'une sous-chaîne. Elle renvoie l'indice où commence cette dernière occurrence.

Dans l'exemple suivant, "Python" apparaît deux fois. rfind() renvoie la position de la deuxième occurrence.

Sortie :

La différence entre find() et rfind() apparaît clairement lorsqu'une sous-chaîne possède plusieurs occurrences.

Sortie :

Comme find(), rfind() renvoie -1 lorsque la sous-chaîne recherchée n'existe pas.

Sortie :

5. Limiter la recherche avec les paramètres start et end

Les méthodes find() et rfind() acceptent des paramètres facultatifs permettant de limiter la recherche à une partie de la chaîne. Le paramètre start indique l'indice à partir duquel la recherche commence.

Dans l'exemple suivant, la recherche commence à l'indice 1. La première occurrence située à l'indice 0 est donc ignorée.

Sortie :

Il est également possible d'indiquer un indice de fin avec un troisième argument. Comme pour le slicing, l'indice end délimite la recherche et n'est pas inclus dans la zone recherchée.

Sortie :

Si la sous-chaîne ne peut pas être entièrement trouvée dans la zone définie, find() renvoie -1.

Sortie :

Les mêmes paramètres peuvent être utilisés avec rfind(). La méthode recherche alors la dernière occurrence située dans la zone définie.

Sortie :

6. Rechercher une sous-chaîne sans tenir compte de la casse

Les méthodes find() et rfind() sont sensibles à la casse. Les chaînes "Python", "python" et "PYTHON" sont donc différentes lors d'une recherche.

Dans l'exemple suivant, la recherche échoue car la casse des deux chaînes est différente.

Sortie :

Pour effectuer une recherche simple sans tenir compte de la casse, on peut convertir temporairement le texte et la sous-chaîne avec lower() ou, pour une comparaison Unicode plus robuste, avec casefold().

Sortie :

7. Extraire du texte à partir d'une position trouvée

La position renvoyée par find() peut être utilisée avec le slicing afin d'extraire une partie de la chaîne à partir de la sous-chaîne trouvée.

Dans l'exemple suivant, find() détermine la position de "Python", puis le slicing extrait le texte à partir de cette position.

Sortie :

Il est préférable de vérifier que find() n'a pas renvoyé -1 avant d'utiliser sa valeur comme indice de slicing.

Sortie :

Il est également possible d'extraire uniquement la partie située avant la sous-chaîne recherchée.

Sortie :

8. Rechercher plusieurs occurrences d'une sous-chaîne

find() renvoie une seule occurrence à chaque appel. Pour rechercher toutes les occurrences, on peut répéter la recherche dans une boucle en déplaçant progressivement l'indice de départ.

Dans l'exemple suivant, on recherche toutes les occurrences du mot "Python" et on affiche leurs positions.

Sortie :

Si l'on souhaite également détecter des occurrences qui se chevauchent, il faut avancer d'un seul caractère après chaque résultat plutôt que de la longueur de la sous-chaîne.

Dans cet exemple, "ana" apparaît deux fois dans "banana", aux indices 1 et 3.

Sortie :

9. Comparer find(), rfind() et l'opérateur in

Lorsque l'on souhaite uniquement savoir si une sous-chaîne existe, l'opérateur in est généralement plus simple et plus lisible que find().

Le programme suivant vérifie la présence de "Python" sans chercher sa position.

Sortie :

find() est préférable lorsque l'on souhaite connaître la position de la première occurrence, tandis que rfind() permet d'obtenir la position de la dernière occurrence.

Sortie :

10. Différence entre find() et index()

Les méthodes find() et index() permettent toutes les deux de rechercher la position d'une sous-chaîne. Leur principale différence apparaît lorsque la sous-chaîne n'existe pas.

find() renvoie -1 lorsque la recherche échoue.

Sortie :

index(), en revanche, déclenche une exception ValueError si la sous-chaîne est absente. Le programme suivant intercepte cette exception afin d'afficher proprement le résultat.

Sortie :

Python propose également rindex(), qui correspond à rfind() mais déclenche ValueError lorsqu'aucune occurrence n'est trouvée.

11. Exemples pratiques avec find() et rfind()

Trouver la position d'un caractère dans une adresse e-mail

find() peut servir à rechercher la position du caractère @ dans une adresse e-mail afin de séparer simplement le nom d'utilisateur et le domaine.

Sortie :

Trouver le dernier point d'un nom de fichier

rfind() est utile pour rechercher le dernier séparateur d'une chaîne. Dans un nom de fichier simple, le dernier point peut servir à repérer l'extension.

Sortie :

Extraire le nom après le dernier séparateur

rfind() peut également être utilisée pour rechercher la dernière occurrence d'un séparateur dans une chaîne représentant un chemin simple.

Sortie :

Rechercher un mot dans une phrase

find() peut être utilisée pour afficher la position d'un mot demandé lorsque celui-ci existe dans une phrase.

Sortie :

12. Erreurs et précautions à connaître

find() est sensible à la casse

Une différence entre majuscules et minuscules suffit pour que la recherche échoue. Il faut donc normaliser la casse lorsque l'application doit effectuer une recherche insensible à la casse.

Sortie :

Ne pas confondre -1 et l'indice 0

L'indice 0 signifie que la sous-chaîne a été trouvée dès le début de la chaîne. La valeur -1 signifie qu'elle n'a pas été trouvée.

Sortie :

Vérifier le résultat avant de l'utiliser comme indice

Utiliser directement -1 dans un slicing peut produire un résultat valide mais incorrect par rapport à l'intention du programme. Il est donc recommandé de vérifier le résultat de find() ou rfind() avant de l'exploiter.

Sortie :

13. À retenir !

Les méthodes find() et rfind() permettent de rechercher la position d'une sous-chaîne dans une chaîne de caractères Python.

  • find() renvoie l'indice de la première occurrence trouvée.
  • rfind() renvoie l'indice de la dernière occurrence trouvée.
  • Les indices commencent à 0.
  • Si la sous-chaîne est absente, find() et rfind() renvoient -1.
  • Une occurrence trouvée au début de la chaîne possède l'indice 0, qu'il ne faut pas confondre avec un échec de recherche.
  • find() et rfind() sont sensibles à la casse.
  • Les paramètres facultatifs start et end permettent de limiter la zone de recherche.
  • L'opérateur in est généralement préférable lorsque l'on souhaite uniquement tester la présence d'une sous-chaîne.
  • index() et rindex() déclenchent ValueError lorsque la recherche échoue, contrairement à find() et rfind().
  • La position obtenue peut être combinée avec le slicing pour extraire une partie de la chaîne.

Le programme suivant résume la différence essentielle entre find() et rfind() lorsque la sous-chaîne apparaît plusieurs fois.

Sortie :

 




Auteur : Younes Derfoufi
Lieu de travail : CRMEF OUJDA
Site Web : www.tresfacile.net
Chaine YouTube : https://www.youtube.com/user/InformatiquesFacile
Me contacter : https://www.tresfacile.net/me-contacter/


loader-image
Le prix initial était : € 11,00.Le prix actuel est : € 10,00.
Le prix initial était : € 6,00.Le prix actuel est : € 5,00.



Leave a Reply

Your email address will not be published. Required fields are marked *