Traitement de texte
Le texte est partout
Section intitulée « Le texte est partout »Le texte est la forme la plus courante de données que traite un programme.
| Domaine | Exemples de données textuelles |
|---|---|
| Web | Pages HTML, URLs, commentaires, messages |
| Science | Séquences d’ADN (ACGT), articles scientifiques, formules chimiques |
| Systèmes | Fichiers journaux, configurations, fichiers CSV |
| Jeux vidéo | Niveaux encodés, dialogues, sauvegardes |
| Linguistique | Corpus, traductions, correction orthographique |
Un biologiste qui analyse une séquence d’ADN, un éditeur de jeu qui charge un niveau depuis un fichier, un data scientist qui nettoie un jeu de données — tous manipulent du texte.
Qu’est-ce qu’une chaîne de caractères ?
Section intitulée « Qu’est-ce qu’une chaîne de caractères ? »Une chaîne de caractères (string) est une séquence de caractères. Le mot-clé ici est séquence — comme une liste.
sequence = "ATGCGC"message = 'Bonjour'Points communs avec les listes
Section intitulée « Points communs avec les listes »Les chaînes partagent beaucoup de traits avec les listes.
| Opération | Liste | Chaîne |
|---|---|---|
| Longueur | len([1, 2, 3]) → 3 | len("ATG") → 3 |
| Accès par indice | liste[0] | "ATG"[0] → 'A' |
| Tranchage | liste[1:3] | "ATGCGC"[1:3] → 'TG' |
| Appartenance | 3 in [1, 2, 3] | "A" in "ATG" → True |
| Itération | for item in liste | for char in "ATG" |
| Concaténation | [1, 2] + [3, 4] | "AT" + "GC" → 'ATGC' |
| Répétition | [0] * 3 → [0, 0, 0] | "A" * 3 → 'AAA' |
adn = "ATGCGCATGC"
print("Longueur :", len(adn))print("Premier :", adn[0])print("Dernier :", adn[-1])print("Du 2e au 4e :", adn[1:4])print("Inversée :", adn[::-1])Résultat de l’exécution
Section intitulée « Résultat de l’exécution »Longueur : 10Premier : ADernier : CDu 2e au 4e : TGCInversée : CGTACGCGTALa différence cruciale : l’immutabilité
Section intitulée « La différence cruciale : l’immutabilité »Contrairement aux listes, les chaînes sont non modifiables (immutable).
liste = [1, 2, 3]liste[0] = 99 # OKprint(liste)
texte = "ATG"texte[0] = "G" # TypeError !C’est pour ça que toutes les méthodes de chaînes retournent une nouvelle chaîne plutôt que de modifier l’original.
Méthodes de transformation
Section intitulée « Méthodes de transformation »Les méthodes de chaînes s’appellent avec la notation pointée et retournent une nouvelle chaîne.
texte = "atg cgc atg"
print(texte.upper())print(texte.lower())print(texte.capitalize())print(texte.title())Résultat de l’exécution
Section intitulée « Résultat de l’exécution »ATG CGC ATGatg cgc atgAtg cgc atgAtg Cgc Atgdonnees = " ATGCGC "
print("[" + donnees.strip() + "]")print("[" + donnees.lstrip() + "]")print("[" + donnees.rstrip() + "]")Résultat de l’exécution
Section intitulée « Résultat de l’exécution »[ATGCGC][ATGCGC ][ ATGCGC]Remplacement
Section intitulée « Remplacement »adn = "ATGCGCATGC"
# Remplacer toutes les occurrencesprint(adn.replace("A", "a"))
# Limiter le nombre de remplacementsprint(adn.replace("A", "a", 1))Résultat de l’exécution
Section intitulée « Résultat de l’exécution »aTGCGCaTGCaTGCGCATGCDécoupage et recollage
Section intitulée « Découpage et recollage »Ces deux méthodes sont inverses l’une de l’autre.
phrase = "chat chien oiseau poisson"
# split : chaîne → listemots = phrase.split(" ")print(mots)
# join : liste → chaînerejoint = "-".join(mots)print(rejoint)Résultat de l’exécution
Section intitulée « Résultat de l’exécution »['chat', 'chien', 'oiseau', 'poisson']chat-chien-oiseau-poissonSans argument, .split() découpe sur tous les espaces blancs (espaces, tabulations, retours à la ligne).
ligne_csv = "Alice,20,88.5,A"champs = ligne_csv.split(",")print(champs)Résultat de l’exécution
Section intitulée « Résultat de l’exécution »['Alice', '20', '88.5', 'A']Méthodes de vérification
Section intitulée « Méthodes de vérification »Ces méthodes retournent un booléen (True ou False).
Prédicats de contenu
Section intitulée « Prédicats de contenu »print("12345".isdigit())print("ATGCGC".isalpha())print("ABC123".isalnum())print("ABC 123".isalnum()) # Espace n'est pas alphanumériqueRésultat de l’exécution
Section intitulée « Résultat de l’exécution »TrueTrueTrueFalse| Méthode | Teste si la chaîne contient |
|---|---|
.isdigit() | Uniquement des chiffres (0-9) |
.isalpha() | Uniquement des lettres |
.isalnum() | Uniquement des lettres ou chiffres |
.isspace() | Uniquement des espaces blancs |
.isupper() | Uniquement des majuscules |
.islower() | Uniquement des minuscules |
Préfixes et suffixes
Section intitulée « Préfixes et suffixes »fichier = "donnees.csv"
print(fichier.startswith("donnees"))print(fichier.endswith(".csv"))print(fichier.endswith((".csv", ".txt", ".json")))Résultat de l’exécution
Section intitulée « Résultat de l’exécution »TrueTrueTrueRecherche
Section intitulée « Recherche »adn = "ATGCGCATGC"
print(adn.find("GC")) # Position de la première occurrenceprint(adn.find("TTT")) # -1 si non trouvéprint(adn.count("GC")) # Nombre d'occurrencesRésultat de l’exécution
Section intitulée « Résultat de l’exécution »3-13Indexage et itération
Section intitulée « Indexage et itération »Parcours caractère par caractère
Section intitulée « Parcours caractère par caractère »adn = "ATGCGC"
for base in adn: print(base)Résultat de l’exécution
Section intitulée « Résultat de l’exécution »ATGCGCParcours avec indice
Section intitulée « Parcours avec indice »adn = "ATGCGC"
for i, base in enumerate(adn): print("Position " + str(i) + " : " + base)Résultat de l’exécution
Section intitulée « Résultat de l’exécution »Position 0 : APosition 1 : TPosition 2 : GPosition 3 : CPosition 4 : GPosition 5 : CExemple : compter les bases
Section intitulée « Exemple : compter les bases »adn = "ATGCGCATGCAAATTTGGG"
a = adn.count("A")t = adn.count("T")g = adn.count("G")c = adn.count("C")
print("A :", a)print("T :", t)print("G :", g)print("C :", c)
# Teneur en GC (importante en biologie moléculaire)teneur_gc = (g + c) / len(adn) * 100print("Teneur en GC : " + format(teneur_gc, ".1f") + " %")Résultat de l’exécution
Section intitulée « Résultat de l’exécution »A : 5T : 4G : 6C : 4Teneur en GC : 52.6 %Concaténation par accumulation
Section intitulée « Concaténation par accumulation »Puisque les chaînes sont immutables, “construire” une chaîne se fait par concaténation ou via une liste.
# Construire la complémentaire d'un brin d'ADN# A ↔ T, G ↔ Cadn = "ATGCGC"complement = []
for base in adn: if base == "A": complement.append("T") elif base == "T": complement.append("A") elif base == "G": complement.append("C") elif base == "C": complement.append("G")
resultat = "".join(complement)print("Original :", adn)print("Complément :", resultat)Résultat de l’exécution
Section intitulée « Résultat de l’exécution »Original : ATGCGCComplément : TACGCGNumPy pour l’analyse de séquences
Section intitulée « NumPy pour l’analyse de séquences »Quand on analyse de grandes séquences (un gène complet fait des milliers de bases), les boucles Python deviennent lentes. NumPy permet des analyses vectorisées très rapides.
Convertir une chaîne en tableau
Section intitulée « Convertir une chaîne en tableau »import numpy as np
adn = "ATGCGCATGC"tableau = np.array(list(adn))print(tableau)print("Forme :", tableau.shape)print("Type :", tableau.dtype)Résultat de l’exécution
Section intitulée « Résultat de l’exécution »['A' 'T' 'G' 'C' 'G' 'C' 'A' 'T' 'G' 'C']Forme : (10,)Type : <U1list("ATGC") découpe la chaîne en caractères. np.array(...) la transforme en tableau NumPy.
Comparaison vectorisée
Section intitulée « Comparaison vectorisée »On peut comparer tous les caractères à une valeur en une seule opération.
import numpy as np
adn = np.array(list("ATGCGCATGCAAATTTGGG"))
# Comparaison vectorisée : retourne un tableau de booléensest_a = adn == "A"print(est_a)
# Compter les True avec sum()print("Nombre de A :", np.sum(est_a))Résultat de l’exécution
Section intitulée « Résultat de l’exécution »[ True False False False False False True False False False True True True False False False False False False]Nombre de A : 5Un tableau booléen peut être sommé directement : chaque True vaut 1, chaque False vaut 0.
Compter toutes les bases
Section intitulée « Compter toutes les bases »import numpy as np
adn = np.array(list("ATGCGCATGCAAATTTGGG"))
for base in ["A", "T", "G", "C"]: compte = np.sum(adn == base) print(base + " : " + str(compte))Résultat de l’exécution
Section intitulée « Résultat de l’exécution »A : 5T : 4G : 6C : 4Le résultat est identique à la version avec .count(), mais la structure s’étend naturellement à des analyses plus complexes.
Comparer deux séquences
Section intitulée « Comparer deux séquences »import numpy as np
sequence_1 = np.array(list("ATGCGCATGC"))sequence_2 = np.array(list("ATGCGCACGC"))
# Quelles positions diffèrent ?differences = sequence_1 != sequence_2print(differences)
# Nombre de différencesprint("Différences :", np.sum(differences))
# Similarité en pourcentagesimilarite = np.mean(sequence_1 == sequence_2) * 100print("Similarité : " + format(similarite, ".1f") + " %")Résultat de l’exécution
Section intitulée « Résultat de l’exécution »[False False False False False False False True False False]Différences : 1Similarité : 90.0 %Trouver les positions d’une base
Section intitulée « Trouver les positions d’une base »import numpy as np
adn = np.array(list("ATGCGCATGCAAATTTGGG"))
positions_a = np.where(adn == "A")[0]print("Positions de A :", positions_a)Résultat de l’exécution
Section intitulée « Résultat de l’exécution »Positions de A : [ 0 6 10 11 12]np.where(condition) retourne les indices où la condition est vraie. C’est l’équivalent vectorisé d’un for avec if.
| Opération | Outil | Exemple |
|---|---|---|
| Découper | .split() | "a,b,c".split(",") → ["a","b","c"] |
| Rejoindre | .join() | "-".join(["a","b"]) → "a-b" |
| Remplacer | .replace() | "ATG".replace("A","a") → "aTG" |
| Compter | .count() | "ATGA".count("A") → 2 |
| Vérifier | .isdigit(), etc. | "123".isdigit() → True |