Travailler avec du texte — indexation, slices et f-strings
Extraire des morceaux de texte, le nettoyer, le transformer, et construire des messages lisibles avec les f-strings — plus la règle que le texte ne peut pas être modifié sur place.
Comment voulez-vous apprendre ?
Le problème que nous résolvons
Un nom arrive depuis un formulaire : " Rafi Ahmed ". Des espaces en trop aux deux bouts, et ce dont vous avez besoin, c'est le prénom seul, plus un message — "Welcome, Rafi!".
Ce travail — nettoyer du texte, en extraire des morceaux, et construire quelque chose de nouveau à partir d'eux — est l'une des tâches les plus fréquentes de la programmation. Noms d'utilisateur, adresses e-mail, identifiants, noms de fichiers, adresses, n'importe quoi qu'une API renvoie : c'est tout du texte.
Et une autre chose deviendra claire aujourd'hui, du genre qui coûte des heures quand on ne la connaît pas : en Python, le texte ne peut pas être modifié. Écrire name.upper() ne met pas name en majuscules. Pourquoi pas, et quoi faire à la place, c'est la partie la plus précieuse de ce chapitre.
À la fin de ce chapitre, vous pourrez
- Atteindre n'importe quel caractère par index, depuis le début et depuis la fin
- Découper une section avec un slice
- Nettoyer et transformer du texte avec
strip,upper,lower,replaceetsplit - Expliquer pourquoi le résultat d'une méthode doit être conservé
- Construire des messages lisibles avec les f-strings
Prérequis : Arithmétique — division, restes et le piège du décimal.
Les guillemets — un ou deux
Pour Python, 'Rafi' et "Rafi" c'est la même chose. Les deux existent pour que les guillemets posés à l'intérieur du texte ne posent pas de problème :
print("It's working")
print('She said "yes"')It's working
She said "yes"Trois guillemets tiennent du texte sur plusieurs lignes :
note = """Dear customer,
Your order is confirmed.
Thank you."""
print(note)Dear customer,
Your order is confirmed.
Thank you.Et \n produit un saut de ligne, \t une tabulation :
print("Name:\tRafi\nRole:\tLearner")Name: Rafi
Role: LearnerLongueur et index
word = "PYTHON"
print(len(word))
print(word[0])
print(word[1])
print(word[-1])
print(word[-2])6
P
Y
N
ODeux choses à fixer dans votre tête :
Le comptage commence à zéro. Le premier caractère a l'index 0, le second 1. Dans un mot de six caractères, le dernier index est donc 5, et non 6. Demandez word[6] et vous obtenez un IndexError. Cette erreur « un de trop » est si courante qu'elle a un nom : un décalage d'un cran (off-by-one error).
Les index négatifs comptent depuis la fin. word[-1] est le dernier caractère, word[-2] l'avant-dernier. C'est la façon facile d'atteindre la fin sans connaître la longueur.
Les slices — découper une section
word = "PROGRAMMING"
print(word[0:7])
print(word[7:11])
print(word[:7])
print(word[7:])
print(word[-4:])PROGRAM
MING
PROGRAM
MING
MINGword[a:b] signifie de a jusqu'à b sans l'inclure. L'indice de fin est exclu.
Au début, cela paraît étrange, mais cela vous offre quelque chose : word[0:7] et word[7:11] s'emboîtent exactement, sans caractère répété ni oublié. Omettre le premier nombre signifie « depuis le tout début », et omettre le second signifie « jusqu'à la toute fin ».
Le texte ne peut pas être modifié
C'est la règle la plus importante de ce chapitre :
name = "rafi"
name[0] = "R"Traceback (most recent call last):
File "D:\python-lab\lesson-06\demo.py", line 2, in <module>
name[0] = "R"
~~~~^^^
TypeError: 'str' object does not support item assignmentLa première ligne File indique le chemin complet de votre fichier ; sur votre ordinateur, elle sera donc différente. Le vrai message est sur la dernière ligne : on ne peut pas remplacer un caractère à l'intérieur d'un texte existant. Alors comment fonctionnent la mise en majuscules ou le nettoyage ? La réponse : Python ne modifie pas l'original, il construit un nouveau morceau de texte et vous le rend.
name = " rafi "
print(name.strip())
print(name.strip().upper())
print("After all that, name is still:", name)rafi
RAFI
After all that, name is still: rafiname n'a pas changé du tout. strip() a produit un nouveau morceau de texte, propre, et nous l'avons simplement affiché — nous ne l'avons jamais stocké.
Il faut donc conserver le résultat :
name = " rafi "
clean_name = name.strip().upper()
print(clean_name)RAFIOu réassignez-le au même nom — name = name.strip(). Cette erreur, appeler une méthode et jeter le résultat, arrive à tout le monde au début. Et elle ne lève aucune erreur, c'est pourquoi il faut un moment pour la repérer.
Les méthodes utiles
raw = " Rafi Ahmed "
print(raw.strip())
print(raw.strip().lower())
print(raw.strip().upper())
print(raw.strip().replace(" ", "_"))
print(len(raw), len(raw.strip()))
print("rafi" in raw.lower())Rafi Ahmed
rafi ahmed
RAFI AHMED
Rafi_Ahmed
14 10
Truestrip()— supprime les espaces au début et à la fin (pas au milieu)lower()/upper()— change la cassereplace(a, b)— metbpartout oùaapparaissaitin— indique si un morceau de texte se trouve à l'intérieur d'un autre
Et split() découpe le texte en morceaux :
full_name = "Rafi Ahmed Khan"
parts = full_name.split(" ")
print(parts)
print(parts[0])
print(len(parts))['Rafi', 'Ahmed', 'Khan']
Rafi
3Ce qu'il y a entre les crochets est une liste, qui a son propre chapitre plus loin dans le cours. Pour l'instant, retenez juste que split() renvoie les morceaux ainsi, et qu'un indice en extrait un seul.
Nettoyez avant de comparer. Si un utilisateur tape"Rafi ", ce n'est pas égal à"rafi"— un espace final et une majuscule font deux différences entre les deux. C'est pourquoi exécuter.strip().lower()avant de comparer est presque une règle universelle dans les vrais projets.
Les f-strings — la façon simple de construire un message
Jusqu'ici, mélanger texte et nombres était pénible. Une f-string simplifie tout : un f devant le guillemet, et ce que vous voulez entre les accolades {} :
name = "Rafi"
items = 3
price = 12.5
print(f"Hello, {name}!")
print(f"{items} items cost {items * price}")
print(f"Rounded: {items * price:.2f}")Hello, Rafi!
3 items cost 37.5
Rounded: 37.50Remarquez trois avantages : vous pouvez calculer à l'intérieur des accolades (items * price), vous ne réfléchissez jamais aux types (les nombres deviennent du texte tout seuls), et :.2f fixe le nombre de décimales — ce dont tout affichage d'un montant a besoin.
Regardez ce qui arrive quand on oublie le f :
name = "Rafi"
print("Hello, {name}")Hello, {name}Pas d'erreur, juste un message faux. L'avoir vu une fois suffit pour le repérer ensuite.
Un exemple complet
account.py :
# Turn a raw form entry into a clean display name and a login id
raw_input_name = " Rafi Ahmed "
domain = "example.com"
clean = raw_input_name.strip()
parts = clean.split(" ")
first_name = parts[0]
last_name = parts[-1]
login_id = f"{first_name.lower()}.{last_name.lower()}"
email = f"{login_id}@{domain}"
initials = f"{first_name[0]}{last_name[0]}"
print(f"Display name : {clean}")
print(f"Login id : {login_id}")
print(f"Email : {email}")
print(f"Initials : {initials}")
print(f"Name length : {len(clean)} characters")Display name : Rafi Ahmed
Login id : rafi.ahmed
Email : [email protected]
Initials : RA
Name length : 10 charactersPourquoi parts[-1] ? Parce qu'un nom peut avoir trois parties. Prendre le dernier morceau depuis la fin fonctionne qu'il y ait deux parties ou trois.
En cas de problème
IndexError: string index out of range L'index que vous demandez dépasse la fin du texte. Rappelez-vous que si len(word) vaut 6, les index valides vont de 0 à 5. Pour le dernier caractère, word[-1] est la façon la plus sûre de l'écrire.
TypeError: 'str' object does not support item assignment Vous avez essayé de changer un caractère à l'intérieur du texte. C'est impossible — construisez plutôt un nouveau texte, par exemple word = "R" + word[1:].
J'ai appelé la méthode et rien n'a changé Le résultat n'a été stocké nulle part. name.strip() ne modifie pas name ; il faut name = name.strip().
strip() n'enlève pas les espaces du milieu strip() ne fonctionne qu'aux deux extrémités. Pour enlever ceux du milieu, utilisez replace(" ", "").
Le message de la f-string sort faux Vérifiez qu'il y a bien un f juste avant le guillemet. Sans lui, les accolades sont imprimées comme des caractères ordinaires.
NameError — le nom écrit dans la f-string est inconnu Ce que vous avez écrit entre les accolades n'a jamais été créé, ou est mal orthographié.
Étape 4 sur 6 — Prédire
Vérifiez votre compréhension
Quelle est la sortie de ces quatre lignes ?
word = "PYTHON"
print(word[0])
print(word[-1])
print(word[1:4])- AP N YTH
- BY N YTHO
- CP O YTH
- DP N YTHO
L'intention était d'afficher Hello, RAFI!, mais le nom sort en minuscules et encore entouré d'espaces. Pourquoi ?
name = " rafi "
name.strip()
name.upper()
print(f"Hello, {name}!")- AUne méthode ne peut être appelée qu'une seule fois sur un morceau de texte, pas deux
- BUne f-string ne peut pas afficher le résultat d'une méthode
- C`strip()` et `upper()` ne modifient pas l'original — elles renvoient un nouveau texte, donc le résultat doit être réassigné à `name`
- D`strip()` ne peut pas être appelée avant `upper()` ; il faut inverser l'ordre
Que s'affiche-t-il avec cette f-string ?
item = "pen"
qty = 3
price = 12.5
print(f"{qty} x {item} = {qty * price:.2f}")- A3 x pen = 37.50
- B3 x pen = 37.5
- C{qty} x {item} = {qty * price}
- D3 x pen = 3 * 12.5
Répondre nécessite un compte
Connectez-vous pour vérifier vos réponses
Les questions sont ci-dessus, et les résoudre de tête est ce qui compte vraiment. Connectez-vous pour voir les réponses, les explications et les indices à trois niveaux.
À vous de jouer
Écrivez un fichier appelé slug.py qui transforme un titre en une forme adaptée à une adresse web.
Valeur de départ : title = " Learn Python Step By Step "
La sortie doit être :
Title : Learn Python Step By Step
Slug : learn-python-step-by-step
Slug length: 25Quatre conditions :
- Supprimez les espaces en trop aux deux bouts
- Mettez tout en minuscules
- Remplacez les espaces intérieurs par des tirets
- Affichez les trois lignes avec des f-strings
Puis faites une chose en plus : changez title en " Python for Beginners " et exécutez-le. Si le nouveau titre sort correctement sans que vous touchiez au code, c'est que vous avez écrit un vrai calcul au lieu de taper les réponses à la main.
Cette mission va plus loin
Ce que vous avez lu ci-dessus est la mission complète — rien n’en a été retiré. Pro ajoute :
- Ce qui se passe vraiment en coulisses : comment Python exécute ce code
- La solution complète de l’exercice, expliquée étape par étape
- Des exercices supplémentaires plus difficiles
- La question d’entretien sur ce sujet, avec une réponse modèle
Étape 6 sur 6
Défi — le quiz du chapitre
Dix questions, de la plus facile à la plus difficile. Les dernières sont difficiles exprès.
Connectez-vous pour faire le quiz