Fondamentals du traitement du texte

Intermediate

This tutorial is from open-source community. Access the source code

Introduction

Cette section présente des méthodes de travail avec le texte.

Ceci est un Guided Lab, qui fournit des instructions étape par étape pour vous aider à apprendre et à pratiquer. Suivez attentivement les instructions pour compléter chaque étape et acquérir une expérience pratique. Les données historiques montrent que c'est un laboratoire de niveau intermédiaire avec un taux de réussite de 74%. Il a reçu un taux d'avis positifs de 86% de la part des apprenants.

Représentation de texte littéral

Les littéraux de chaîne de caractères sont écrits dans les programmes avec des guillemets.

## Guillemet simple
a = 'Yeah but no but yeah but...'

## Guillemet double
b = "computer says no"

## Guillemets triples
c = '''
Look into my eyes, look into my eyes, the eyes, the eyes, the eyes,
not around the eyes,
don't look around the eyes,
look into my eyes, you're under.
'''

Normalement, les chaînes de caractères ne peuvent s'étendre sur qu'une seule ligne. Les guillemets triples capturent tout le texte inclus sur plusieurs lignes, y compris tout le formattage.

Il n'y a pas de différence entre l'utilisation de guillemets simples (') et de guillemets doubles ("). Cependant, le même type de guillemet utilisé pour commencer une chaîne doit être utilisé pour la terminer.

Codes d'échappement de chaîne de caractères

Les codes d'échappement sont utilisés pour représenter les caractères de contrôle et les caractères qui ne peuvent pas être facilement saisis directement au clavier. Voici quelques codes d'échappement courants :

'\n'      Retour à la ligne
'\r'      Retour chariot
'\t'      Tabulation
'\''      Guillemet simple littéral
'\"'      Guillemet double littéral
'\\'      Antislash littéral

Représentation de chaînes de caractères

Chaque caractère dans une chaîne est stocké en interne sous la forme d'un soi-disant "point de code" Unicode, qui est un entier. Vous pouvez spécifier une valeur exacte de point de code à l'aide des séquences d'échappement suivantes :

a = '\xf1'          ## a = 'ñ'
b = '\u2200'        ## b = '∀'
c = '\U0001D122'    ## c = '𝄢'
d = '\N{FOR ALL}'   ## d = '∀'

La Unicode Character Database est une référence pour tous les codes de caractères disponibles.

Indexation des chaînes de caractères

Les chaînes de caractères fonctionnent comme un tableau pour accéder à des caractères individuels. Vous utilisez un indice entier, commençant à 0. Les indices négatifs spécifient une position relative à la fin de la chaîne.

a = 'Hello world'
b = a[0]          ## 'H'
c = a[4]          ## 'o'
d = a[-1]         ## 'd' (fin de la chaîne)

Vous pouvez également extraire ou sélectionner des sous-chaînes en spécifiant une plage d'indices avec :.

d = a[:5]     ## 'Hello'
e = a[6:]     ## 'world'
f = a[3:8]    ## 'lo wo'
g = a[-5:]    ## 'world'

Le caractère à l'indice de fin n'est pas inclus. Les indices manquants supposent le début ou la fin de la chaîne.

Opérations sur les chaînes de caractères

Concaténation, longueur, appartenance et replication.

## Concaténation (+)
a = 'Hello' + 'World'   ## 'HelloWorld'
b = 'Say'+ a          ## 'Say HelloWorld'

## Longueur (len)
s = 'Hello'
len(s)                  ## 5

## Test d'appartenance (`in`, `not in`)
t = 'e' in s            ## True
f = 'x' in s            ## False
g = 'hi' not in s       ## True

## Replication (s * n)
rep = s * 5             ## 'HelloHelloHelloHelloHello'

Méthodes de chaîne de caractères

Les chaînes de caractères ont des méthodes qui effectuent diverses opérations sur les données de chaîne.

Exemple : enlever tout espace blanc en début / fin.

s ='  Hello '
t = s.strip()     ## 'Hello'

Exemple : conversion de cas.

s = 'Hello'
l = s.lower()     ## 'hello'
u = s.upper()     ## 'HELLO'

Exemple : remplacement de texte.

s = 'Hello world'
t = s.replace('Hello', 'Hallo')   ## 'Hallo world'

Plus de méthodes de chaîne de caractères :

Les chaînes de caractères ont une grande variété d'autres méthodes pour tester et manipuler les données de texte. Voici un petit échantillon de méthodes :

s.endswith(suffix)     ## Vérifier si la chaîne se termine par suffix
s.find(t)              ## Première occurrence de t dans s
s.index(t)             ## Première occurrence de t dans s
s.isalpha()            ## Vérifier si les caractères sont alphabétiques
s.isdigit()            ## Vérifier si les caractères sont numériques
s.islower()            ## Vérifier si les caractères sont en minuscules
s.isupper()            ## Vérifier si les caractères sont en majuscules
s.join(slist)          ## Joindre une liste de chaînes de caractères en utilisant s comme délimiteur
s.lower()              ## Convertir en minuscules
s.replace(old,new)     ## Remplacer du texte
s.rfind(t)             ## Rechercher t à partir de la fin de la chaîne
s.rindex(t)            ## Rechercher t à partir de la fin de la chaîne
s.split([delim])       ## Diviser la chaîne en une liste de sous-chaînes
s.startswith(prefix)   ## Vérifier si la chaîne commence par prefix
s.strip()              ## Enlever les espaces blancs en début / fin
s.upper()              ## Convertir en majuscules

Immutabilité des chaînes de caractères

Les chaînes de caractères sont "immuables" ou en lecture seule. Une fois créées, leur valeur ne peut pas être modifiée.

>>> s = 'Hello World'
>>> s[1] = 'a'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError:'str' object does not support item assignment
>>>

Toutes les opérations et méthodes qui manipulent les données de chaîne de caractères créent toujours de nouvelles chaînes de caractères.

Conversions de chaînes de caractères

Utilisez str() pour convertir n'importe quelle valeur en une chaîne de caractères. Le résultat est une chaîne de caractères contenant le même texte que celui qui aurait été produit par l'instruction print().

>>> x = 42
>>> str(x)
'42'
>>>

Chaînes d'octets

Une chaîne d'octets de 8 bits, couramment rencontrée dans les entrées/sorties de bas niveau, est écrite comme suit :

data = b'Hello World\r\n'

En plaçant un petit b avant la première citation, vous spécifiez qu'il s'agit d'une chaîne d'octets contrairement à une chaîne de texte.

La plupart des opérations habituelles sur les chaînes fonctionnent.

len(data)                         ## 13
data[0:5]                         ## b'Hello'
data.replace(b'Hello', b'Cruel')  ## b'Cruel World\r\n'

L'indexation est un peu différente car elle renvoie les valeurs d'octets sous forme d'entiers.

data[0]   ## 72 (code ASCII pour 'H')

Conversion vers/à partir de chaînes de texte.

text = data.decode('utf-8') ## octets -> texte
data = text.encode('utf-8') ## texte -> octets

L'argument 'utf-8' spécifie un codage de caractères. Les autres valeurs courantes incluent 'ascii' et 'latin1'.

Chaînes brutes

Les chaînes brutes sont des littéraux de chaîne avec un antislash non interprété. Elles sont spécifiées en préfixant la première citation avec une "r" en minuscules.

>>> rs = r'c:\newdata\test' ## Chaîne brute (antislash non interprété)
>>> rs
'c:\\newdata\\test'

La chaîne est le texte littéral contenu à l'intérieur, exactement comme il a été tapé. Cela est utile dans des situations où l'antislash a une signification spéciale. Exemple : nom de fichier, expressions régulières, etc.

Chaînes f

Une chaîne avec substitution d'expression formatée.

>>> name = 'IBM'
>>> shares = 100
>>> price = 91.1
>>> a = f'{name:>10s} {shares:10d} {price:10.2f}'
>>> a
'       IBM        100      91.10'
>>> b = f'Cost = ${shares*price:0.2f}'
>>> b
'Cost = $9110.00'
>>>

Remarque : Cela nécessite Python 3.6 ou une version ultérieure. La signification des codes de format est abordée plus tard.

Dans ces exercices, vous allez experimenter avec des opérations sur le type de chaîne de Python. Vous devriez le faire à l'invite interactive de Python où vous pouvez facilement voir les résultats. Note importante :

Dans les exercices où vous êtes supposé interagir avec l'interpréteur, >>> est l'invite de l'interpréteur que vous obtenez lorsque Python vous demande de taper une nouvelle instruction. Certaines instructions dans l'exercice s'étendent sur plusieurs lignes - pour exécuter ces instructions, vous devrez peut-être appuyer sur 'entrée' plusieurs fois. Juste un rappel que vous NE PAS taper le >>> lorsque vous travaillez sur ces exemples.

Commencez par définir une chaîne contenant une série de symboles de cotation boursière comme ceci :

>>> symbols = 'AAPL,IBM,MSFT,YHOO,SCO'
>>>

Exercice 1.13 : Extraction de caractères individuels et de sous-chaînes

Les chaînes de caractères sont des tableaux de caractères. Essayez d'extraire quelques caractères :

>>> symbols[0]
?
>>> symbols[1]
?
>>> symbols[2]
?
>>> symbols[-1]        ## Dernier caractère
?
>>> symbols[-2]        ## Les indices négatifs sont à partir de la fin de la chaîne
?
>>>

En Python, les chaînes de caractères sont en lecture seule.

Vérifiez-le en essayant de changer le premier caractère de symbols en 'a' en minuscules.

>>> symbols[0] = 'a'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
>>>

Exercice 1.14 : Concaténation de chaînes de caractères

Bien que les données de chaîne de caractères soient en lecture seule, vous pouvez toujours réaffecter une variable à une chaîne de caractères nouvellement créée.

Essayez l'énoncé suivant qui concatène un nouveau symbole "GOOG" à la fin de symbols :

>>> symbols = symbols + 'GOOG'
>>> symbols
'AAPL,IBM,MSFT,YHOO,SCOGOOG'
>>>

Oups! Ce n'est pas ce que vous vouliez. Corrigez-le de sorte que la variable symbols contienne la valeur 'AAPL,IBM,MSFT,YHOO,SCO,GOOG'.

>>> symbols =?
>>> symbols
'AAPL,IBM,MSFT,YHOO,SCO,GOOG'
>>>

Ajoutez 'HPQ' au début de la chaîne :

>>> symbols =?
>>> symbols
'HPQ,AAPL,IBM,MSFT,YHOO,SCO,GOOG'
>>>

Dans ces exemples, il peut sembler que la chaîne d'origine soit modifiée, en apparence en violation du fait que les chaînes sont en lecture seule. Ce n'est pas le cas. Les opérations sur les chaînes créent une chaîne entièrement nouvelle chaque fois. Lorsque le nom de variable symbols est réaffecté, il pointe vers la chaîne nouvellement créée. Ensuite, l'ancienne chaîne est détruite car elle n'est plus utilisée.

Exercice 1.15 : Test d'appartenance (test de sous-chaîne)

Experimentez l'opérateur in pour vérifier l'existence de sous-chaînes. À l'invite interactive, essayez ces opérations :

>>> 'IBM' in symbols
?
>>> 'AA' in symbols
True
>>> 'CAT' in symbols
?
>>>

Pourquoi le test de 'AA' a-t-il retourné True?

Exercice 1.16 : Méthodes de chaîne de caractères

À l'invite interactive de Python, essayez d'expérimenter avec certaines des méthodes de chaîne de caractères.

>>> symbols.lower()
?
>>> symbols
?
>>>

Rappelez-vous, les chaînes de caractères sont toujours en lecture seule. Si vous voulez conserver le résultat d'une opération, vous devez le placer dans une variable :

>>> lowersyms = symbols.lower()
>>>

Essayez d'autres opérations :

>>> symbols.find('MSFT')
?
>>> symbols[13:17]
?
>>> symbols = symbols.replace('SCO','DOA')
>>> symbols
?
>>> name = '   IBM   \n'
>>> name = name.strip()    ## Supprime les espaces blancs environnants
>>> name
?
>>>

Exercice 1.17 : f-strings

Parfois, vous voulez créer une chaîne de caractères et intégrer les valeurs de variables à l'intérieur.

Pour ce faire, utilisez une f-string. Par exemple :

>>> name = 'IBM'
>>> shares = 100
>>> price = 91.1
>>> f'{shares} parts de {name} à ${price:0.2f}'
'100 parts de IBM à $91.10'
>>>

Modifiez le programme mortgage.py de l'exercice 1.10 pour créer sa sortie à l'aide de f-strings. Essayez de le faire de manière à ce que la sortie soit bien alignée.

Exercice 1.18 : Expressions régulières

Une limitation des opérations de base sur les chaînes de caractères est qu'elles ne prennent pas en charge aucun type de correspondance de motif avancée. Pour cela, vous devez utiliser le module re de Python et les expressions régulières. La manipulation des expressions régulières est un sujet vaste, mais voici un exemple court :

>>> text = 'Today is 3/27/2018. Tomorrow is 3/28/2018.'
>>> ## Trouvez toutes les occurrences d'une date
>>> import re
>>> re.findall(r'\d+/\d+/\d+', text)
['3/27/2018', '3/28/2018']
>>> ## Remplacez toutes les occurrences d'une date par du texte de remplacement
>>> re.sub(r'(\d+)/(\d+)/(\d+)', r'\3-\1-\2', text)
'Today is 2018-3-27. Tomorrow is 2018-3-28.'
>>>

Pour plus d'informations sur le module re, consultez la documentation officielle à https://docs.python.org/library/re.html.

Commentaire

Au fur et à mesure que vous commencez à expérimenter avec l'interpréteur, vous voulez souvent en savoir plus sur les opérations prises en charge par différents objets. Par exemple, comment découvrir quelles opérations sont disponibles sur une chaîne de caractères?

Selon votre environnement Python, vous devriez peut-être être en mesure de voir une liste des méthodes disponibles via la complétion par tabulation. Par exemple, essayez d'entrer ceci :

>>> s = 'hello world'
>>> s.<tabulation>
>>>

Si appuyer sur la touche Tab ne produit aucun effet, vous pouvez recourir à la fonction intégrée dir(). Par exemple :

>>> s = 'hello'
>>> dir(s)
['__add__', '__class__', '__contains__',..., 'find', 'format',
'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace',
'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition',
'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit',
'rstrip','split','splitlines','startswith','strip','swapcase',
'title', 'translate', 'upper', 'zfill']
>>>

dir() produit une liste de toutes les opérations qui peuvent apparaître après le (.). Utilisez la commande help() pour obtenir plus d'informations sur une opération spécifique :

>>> help(s.upper)
Aide sur la fonction intégrée upper :

upper(...)
    S.upper() -> chaîne de caractères

    Retourne une copie de la chaîne de caractères S convertie en majuscules.
>>>

Sommaire

Félicitations! Vous avez terminé le laboratoire sur les chaînes de caractères. Vous pouvez pratiquer d'autres laboratoires sur LabEx pour améliorer vos compétences.