1.2. Les chaînes de caractères (String : str)

# Afficher la table des matières

from jyquickhelper import add_notebook_menu
add_notebook_menu()
run previous cell, wait for 2 seconds

Les chaînes sont le type de variable utilisé pour stocker des messages texte.

1.2.1. Syntaxe

Trois syntaxes :

  1- simples quotes : 'Bonjour, dit-elle'

  2- doubles quotes : "Que se passe t'il ?"

  3- triple quotes (simples ou doubles) : '''chaînes multilignes'''

Passage à la ligne : Ligne 1 \n Ligne 2

s = "Bonjour"
type(s)
str

1.2.2. Caractère d’échappement

Le symbole \ permet :

* \n : un saut de ligne
* \t : une tabulation
* \' : le « ' », permet de ne pas fermer la chaine de caractères, eg., 'aujourd\'hui'
* \" : le « " », permet de ne pas fermer la chaine de caractères, eg. " Bonjour \"Pierre\" "
* \\ est un « \ »

1.2.3. Opérations sur les caractères

Comme n’importe quelle séquence, les chaînes de caractères supportent :

- le test d’appartenance, la concaténation, la répétition,
- la taille, le plus petit/plus grand élément,..

Operation

Rôle

ch1+ch2

Concatène (colle l’une à la suite de l’autre) les chaines ch1 et ch2.

ch1 * n ou n *c h1

Concatène n fois la chaine ch1.

# concaténation
phrase = 'Bienvenue '+ 'à l\'ENSAI'   

# Longueur de la chaîne: le nombre de caractères
len(phrase)    
19
# test d’appartenance à la chaîne
'u' in phrase    
True
# Determine la position du mot "ENSAI" dans la chaîne de caractères "phrase" 
phrase.index('ENSAI')
14

En tant que séquence,

  • 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)

s[0]
'B'
  • Il est possible d’indéxer en partant de la fin avec des indices négatifs :

s[-1]
'r'
  • 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):

s[0:12]
'Bonjour'
  • 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 :

s[:4]
'Bonj'
s[14:]
''
s[:]
'Bonjour'
  • 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) :

s[::3]
'Bjr'

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

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.

Parmi les fonctions les plus souvent utilisées sur les chaînes on cite :

Méthode

Rôle

strip, lstrip, rstrip

Élimine les espaces

split

Découpe (en une liste)

join

Recolle une liste de chaînes

find

Recherche une sous-chaîne

replace

Remplace une sous-chaîne

upper, lower

Renvoie la chaine en majuscules, miniscules

capitalize

Renvoie la chaine avec la première lettre en majuscule

count

Renvoie le nombre d’occurence

1.2.4. Méthodes sur les caractères

1.2.4.1. find: Trouver l’index d’une sous-chaîne dans une chaîne de caractères

Si vous voulez trouver l’indice d’une sous-chaîne dans une chaîne de caractères, utilisez la méthode find(). Cette méthode renvoie l’indice de la première occurrence de la sous-chaîne si elle est trouvée et -1 sinon.

phrase = "Bonjour je m'appelle Pierre"

# Trouver l'index de la première occurrence de la sous-chaîne.
phrase.find("Pierre")
21
phrase.find("Marie")
-1

Vous pouvez également indiquer la position de départ et de fin de la recherche :

# Commence la cherche de la sous-chaîne à partir de l'index 7
phrase.find("Pierre", 7)
21
# Commence la cherche de la sous-chaîne à partir de l'index 7 et prend fin à l'index 18
phrase.find("P", 5, 10)
-1

1.2.4.2. re.sub : Remplacer une chaîne par une autre chaîne à l’aide d’une expression régulière

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.

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.

Dans le code ci-dessous, on remplace 12/12/2018 par mardi et on remplace 12/12/2018 par 2018/12/12.

import re

texte = "Cours d'anglais le 12/12/2018"
concordance = r"(\d+)/(\d+)/(\d+)"

re.sub(concordance, "mardi", texte)
"Cours d'anglais le mardi"
re.sub(concordance, r"\3/\1/\2", texte)
"Cours d'anglais le 2018/12/12"

1.2.4.3. difflib.SequenceMatcher : Détecter les articles “presque similaires

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é).

Comment détecter les articles “presque similaires” et en éliminer un ? C’est là que difflib.SequenceMatcher peut s’avérer utile.

from difflib import SequenceMatcher

text1 = 'Je rentre du travail'
text2 = 'Je rentre du boulot'
print(SequenceMatcher(a=text1, b=text2).ratio())
0.717948717948718

1.2.4.4. difflib.get_close_matches : Obtenir une liste des meilleures correspondances pour un certain mot

Si vous voulez obtenir une liste des meilleures correspondances pour un certain mot, utilisez difflib.get_close_matches.

from difflib import get_close_matches

Fruits = ['Pomme', 'Poire','Peche','Pruneau','Fraise']
get_close_matches('Prune', Fruits)
['Pruneau', 'Poire']

Pour obtenir des correspondances plus proches, augmentez la valeur de l’argument cutoff (par défaut 0.6).

get_close_matches('Prune', Fruits, cutoff=0.8)
['Pruneau']