{ "cells": [ { "cell_type": "markdown", "id": "2f05248e", "metadata": {}, "source": [ "## Les chaînes de caractères (String : str)" ] }, { "cell_type": "code", "execution_count": 79, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
run previous cell, wait for 2 seconds
\n", "" ], "text/plain": [ "" ] }, "execution_count": 79, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Afficher la table des matières\n", "\n", "from jyquickhelper import add_notebook_menu\n", "add_notebook_menu()" ] }, { "cell_type": "markdown", "id": "73ce9ad5", "metadata": {}, "source": [ "Les chaînes sont le type de variable utilisé pour stocker des messages texte." ] }, { "cell_type": "markdown", "id": "74465775", "metadata": {}, "source": [ "### Syntaxe\n", "**Trois syntaxes :**\n", "\n", " 1- simples quotes : 'Bonjour, dit-elle'\n", "\n", " 2- doubles quotes : \"Que se passe t'il ?\"\n", "\n", " 3- triple quotes (simples ou doubles) : '''chaînes multilignes'''\n", "\n", "\n", "\n", "Passage à la ligne : Ligne 1 \\n Ligne 2" ] }, { "cell_type": "code", "execution_count": 80, "id": "c96d14ed", "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "str" ] }, "execution_count": 80, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s = \"Bonjour\"\n", "type(s)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Caractère d'échappement\n", "\n", "Le symbole \\ permet :\n", "\n", " * \\n : un saut de ligne\n", " * \\t : une tabulation\n", " * \\' : le « ' », permet de ne pas fermer la chaine de caractères, eg., 'aujourd\\'hui'\n", " * \\\" : le « \" », permet de ne pas fermer la chaine de caractères, eg. \" Bonjour \\\"Pierre\\\" \"\n", " * \\\\ est un « \\ »" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Opérations sur les caractères" ] }, { "cell_type": "markdown", "id": "58adc6f9", "metadata": {}, "source": [ "Comme n’importe quelle séquence, les chaînes de caractères supportent :\n", "\n", " - le test d’appartenance, la concaténation, la répétition,\n", " - la taille, le plus petit/plus grand élément,.." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "| Operation | Rôle |\n", "| :- | :-: |\n", "|ch1+ch2\t |Concatène (colle l'une à la suite de l'autre) les chaines ch1 et ch2. |\n", "|ch1 * n ou n *c h1 | \tConcatène n fois la chaine ch1. |\n" ] }, { "cell_type": "code", "execution_count": 81, "id": "48cd72d2", "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "19" ] }, "execution_count": 81, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# concaténation\n", "phrase = 'Bienvenue '+ 'à l\\'ENSAI' \n", "\n", "# Longueur de la chaîne: le nombre de caractères\n", "len(phrase) " ] }, { "cell_type": "code", "execution_count": 82, "id": "f009727d", "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 82, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# test d’appartenance à la chaîne\n", "'u' in phrase " ] }, { "cell_type": "code", "execution_count": 83, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "14" ] }, "execution_count": 83, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Determine la position du mot \"ENSAI\" dans la chaîne de caractères \"phrase\" \n", "phrase.index('ENSAI')" ] }, { "cell_type": "markdown", "id": "45527495", "metadata": {}, "source": [ "En tant que séquence,\n", "\n", "* on peut accéder aux éléments de la chaîne par leur index en utilisant **[index]**. *Note :* Les index sont utilisés de 0 à (n-1)" ] }, { "cell_type": "code", "execution_count": 84, "id": "6b5df608", "metadata": { "collapsed": false, "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "'B'" ] }, "execution_count": 84, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s[0]" ] }, { "cell_type": "markdown", "id": "b5bb61a9", "metadata": {}, "source": [ "* Il est possible d'indéxer en partant de la fin avec des indices négatifs :" ] }, { "cell_type": "code", "execution_count": 85, "id": "a4b49205", "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'r'" ] }, "execution_count": 85, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s[-1]" ] }, { "cell_type": "markdown", "id": "6778d950", "metadata": {}, "source": [ "* On peut extraire une partie d'une chaîne en utilisant la syntaxe **[start: stop]**, qui extrait les caractères entre index start et stop -1 (le caractère à l'index stop n'est pas inclus):" ] }, { "cell_type": "code", "execution_count": 86, "id": "9850d431", "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'Bonjour'" ] }, "execution_count": 86, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s[0:12]" ] }, { "cell_type": "markdown", "id": "161641a5", "metadata": {}, "source": [ "* Si nous omettons l'index start ou stop (ou les deux) de [start: stop], la valeur par défaut est le début et la fin de la chaîne, respectivement :" ] }, { "cell_type": "code", "execution_count": 87, "id": "4200d3fc", "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'Bonj'" ] }, "execution_count": 87, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s[:4]" ] }, { "cell_type": "code", "execution_count": 88, "id": "a17418af", "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "''" ] }, "execution_count": 88, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s[14:]" ] }, { "cell_type": "code", "execution_count": 89, "id": "bf8a80de", "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'Bonjour'" ] }, "execution_count": 89, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s[:]" ] }, { "cell_type": "markdown", "id": "ce299051", "metadata": {}, "source": [ "* Nous pouvons également définir \"le pas (step)\" en utilisant la syntaxe [start: end: step] (la valeur par défaut pour step est 1, comme nous l'avons vu ci-dessus) :" ] }, { "cell_type": "code", "execution_count": 90, "id": "71a0dfbe", "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'Bjr'" ] }, "execution_count": 90, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s[::3]" ] }, { "cell_type": "markdown", "id": "9a537fd7", "metadata": {}, "source": [ "Cette technique est appelée Slicing. Pour en savoir plus sur la syntaxe, cliquez ici: 'http://docs.python.org/release/2.7.3/library/functions.html?highlight=slice#slice'\n", "\n", "Python possède un ensemble très riche de fonctions pour le traitement de texte. Voir par exemple 'http://docs.python.org/2/library/string.html' pour plus d'informations.\n", "\n", "Parmi les fonctions les plus souvent utilisées sur les chaînes on cite :\n", "\n", "| Méthode | Rôle |\n", "|------------------------|------------------------------|\n", "| strip, lstrip, rstrip | Élimine les espaces |\n", "| split | Découpe (en une liste) |\n", "| join | Recolle une liste de chaînes |\n", "| find | Recherche une sous-chaîne |\n", "| replace | Remplace une sous-chaîne |\n", "| upper, lower | Renvoie la chaine en majuscules, miniscules |\n", "| capitalize | Renvoie la chaine avec la première lettre en majuscule |\n", "| count | Renvoie le nombre d'occurence |\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Méthodes sur les caractères" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### find: Trouver l'index d'une sous-chaîne dans une chaîne de caractères\n", "\n", "Si vous voulez trouver l'indice d'une sous-chaîne dans une chaîne de caractères, utilisez la méthode `find()`. \n", "Cette méthode renvoie l'indice de la première occurrence de la sous-chaîne si elle est trouvée et `-1` sinon." ] }, { "cell_type": "code", "execution_count": 91, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "21" ] }, "execution_count": 91, "metadata": {}, "output_type": "execute_result" } ], "source": [ "phrase = \"Bonjour je m'appelle Pierre\"\n", "\n", "# Trouver l'index de la première occurrence de la sous-chaîne.\n", "phrase.find(\"Pierre\")" ] }, { "cell_type": "code", "execution_count": 92, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "-1" ] }, "execution_count": 92, "metadata": {}, "output_type": "execute_result" } ], "source": [ "phrase.find(\"Marie\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Vous pouvez également indiquer la position de départ et de fin de la recherche :\n" ] }, { "cell_type": "code", "execution_count": 93, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "21" ] }, "execution_count": 93, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Commence la cherche de la sous-chaîne à partir de l'index 7\n", "phrase.find(\"Pierre\", 7)" ] }, { "cell_type": "code", "execution_count": 94, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "-1" ] }, "execution_count": 94, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Commence la cherche de la sous-chaîne à partir de l'index 7 et prend fin à l'index 18\n", "phrase.find(\"P\", 5, 10)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### re.sub : Remplacer une chaîne par une autre chaîne à l'aide d'une expression régulière\n", "\n", "Si vous souhaitez remplacer une chaîne de caractères par une autre ou modifier l'ordre des caractères dans une chaîne, utilisez `re.sub`.\n", "\n", "`re.sub` vous permet d'utiliser une expression régulière pour spécifier le motif de la chaîne de caractères que vous souhaitez remplacer.\n", "\n", "Dans le code ci-dessous, on remplace **12/12/2018** par `mardi` et on remplace **12/12/2018** par `2018/12/12`." ] }, { "cell_type": "code", "execution_count": 95, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "\"Cours d'anglais le mardi\"" ] }, "execution_count": 95, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import re\n", "\n", "texte = \"Cours d'anglais le 12/12/2018\"\n", "concordance = r\"(\\d+)/(\\d+)/(\\d+)\"\n", "\n", "re.sub(concordance, \"mardi\", texte)" ] }, { "cell_type": "code", "execution_count": 96, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "\"Cours d'anglais le 2018/12/12\"" ] }, "execution_count": 96, "metadata": {}, "output_type": "execute_result" } ], "source": [ "re.sub(concordance, r\"\\3/\\1/\\2\", texte)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### difflib.SequenceMatcher : Détecter les articles \"presque similaires\n", "\n", "Lors de l'analyse d'articles, différents articles peuvent être presque similaires mais pas identiques à 100 %, peut-être à cause de la grammaire ou du changement de deux ou trois mots (comme le postage croisé). \n", "\n", "Comment détecter les articles \"presque similaires\" et en éliminer un ? C'est là que `difflib.SequenceMatcher` peut s'avérer utile." ] }, { "cell_type": "code", "execution_count": 97, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.717948717948718\n" ] } ], "source": [ "from difflib import SequenceMatcher\n", "\n", "text1 = 'Je rentre du travail'\n", "text2 = 'Je rentre du boulot'\n", "print(SequenceMatcher(a=text1, b=text2).ratio())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### difflib.get_close_matches : Obtenir une liste des meilleures correspondances pour un certain mot\n", "\n", "Si vous voulez obtenir une liste des meilleures correspondances pour un certain mot, utilisez difflib.get_close_matches." ] }, { "cell_type": "code", "execution_count": 98, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['Pruneau', 'Poire']" ] }, "execution_count": 98, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from difflib import get_close_matches\n", "\n", "Fruits = ['Pomme', 'Poire','Peche','Pruneau','Fraise']\n", "get_close_matches('Prune', Fruits)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Pour obtenir des correspondances plus proches, augmentez la valeur de l'argument cutoff (par défaut 0.6)." ] }, { "cell_type": "code", "execution_count": 99, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['Pruneau']" ] }, "execution_count": 99, "metadata": {}, "output_type": "execute_result" } ], "source": [ "get_close_matches('Prune', Fruits, cutoff=0.8)\n" ] } ], "metadata": { "anaconda-cloud": {}, "interpreter": { "hash": "40d3a090f54c6569ab1632332b64b2c03c39dcf918b08424e98f38b5ae0af88f" }, "kernelspec": { "display_name": "Python [Root]", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.8" } }, "nbformat": 4, "nbformat_minor": 0 }