SlideShare uma empresa Scribd logo
1 de 53
Baixar para ler offline
PI2T Développement informatique
Séance 3
Chaines de caractères
et expressions régulières
Sébastien Combéfis, Quentin Lurkin 22 février 2016
Ce(tte) œuvre est mise à disposition selon les termes de la Licence Creative Commons
Attribution – Pas d’Utilisation Commerciale – Pas de Modification 4.0 International.
Objectifs
Manipulation de chaines de caractères
La classe str
Fonctions dans la librairie standard
Optimisations pour la manipulation de chaines
Utilisation des expressions régulières
Vérifier qu’une chaine de caractères matche un motif
Chercher des sous-chaines correspondant à un motif
Extraire des sous-chaines correspondant à un motif
3
Chaine de caractères
Séquence de caractères
Une chaine de caractères est une séquence non modifiable
Séquence de caractères Unicode
Opérations d’accès des séquences utilisables
Longueur, accès, slicing, appartenance (in), parcours (for)
1 s = ’Hello world!’
2
3 print(len(s)) # 12
4 print(s[0]) # H
5 print(s[0:4]) # Hell
6 print(’ ’ in s) # True
7 for c in s: # Helloworld!
8 if c != ’ ’:
9 print(c, end=’’)
5
Littéraux
Littéraux sur une ligne délimités par ’ ou "
Choix libre du simple ou double guillemet
Littéraux étendus sur plusieurs lignes avec triples guillemets
Notamment utilisés pour la documentation
1 question = "Where ’s my Maneki -neko?"
2
3 affirmation = ’You can call me "The Beast "!’
4
5 haiku = """ Yesterday it worked.
6 Today it is not working.
7 Windows is like that."""
Plus de haikus pour programmeurs ici : http://www.libertybasicuniversity.com/lbnews/nl107/haiku.htm.
6
Séquence d’échappement (1)
Séquence d’échappement pour insérer certains caractères
Utilisation du caractère d’échappement 
Caractères spéciaux ou spécification de la valeur Unicode
Caractère Unicode spécifié par sa valeur en hexadécimal
1 s = ’Courses :n- DVDt12 .99 u20acn- Cafét1 .50 u20ac ’
2 print(s)
Courses:
- DVD 12.99e
- Café 1.50e
7
Séquence d’échappement (2)
Quelques exemples de séquences d’échappement
Certaines sont associées à une valeur
Séquence Description
nouvelle_ligne Ignorer la nouvelle ligne
 Backslash
’ Guillemet simple
" Guillemet double
b Backspace
a Cloche
n Nouvelle ligne
r Retour chariot
t Tabulation horizontale
xhh Caractère avec la valeur hexadécimale sur 8 bits hh
uhhhh Caractère avec la valeur hexadécimale sur 16 bits hhhh
8
Exemple : Compte à rebours
Pause dans l’exécution du programme avec time.sleep
Temps d’attente précisé en secondes
Effacer le texte dans le terminal avec b
Forcer l’écriture avec sys.stdout.flush()
1 import sys
2 import time
3
4 counter = 5
5 while counter > 0:
6 print(’b{}’.format(counter), end=’’)
7 sys.stdout.flush ()
8 counter -= 1
9 time.sleep (1)
10 print(’bBOOM!’)
9
Chaine de caractères brute
Séquences d’échappement ignorées dans les chaines brutes
Les caractères d’une chaine brute sont pris tels quels
Définie avec le caractère r avant le guillemet ouvrant
1 print(r’Utilisez u20ac pour ’ + ’insérer un u20ac !’)
Utilisez u20ac pour insérer un e !
10
Classe bytes
Objet bytes est une séquence d’entiers entre 0 et 255
Représentation en mémoire d’une chaine de caractères Unicode
Littéral bytes déclaré en préfixant la chaine avec b
Ne fonctionne qu’avec les caractères ASCII
1 b = b’Listening Nightcore!’
2 print(b)
3 print(type(b))
4 print(b[0])
b’Listening Nightcore!’
<class ’bytes ’>
76
11
byte et str
On ne mélange pas des byte et str dans une même opération
Erreur de type incompatible générée par l’interpréteur Python
Conversion possible d’un type vers l’autre
Utilisation des méthodes encode et decode
1 s = ’Hello ’
2 b = b’World!’
3
4 print(s + ’ ’ + b)
Traceback (most recent call last):
File "test.py", line 4, in <module >
print(s + ’ ’ + b)
TypeError: Can ’t convert ’bytes ’ object to str implicitly
12
Encodage et décodage (1)
Spécification de l’encodage à utiliser avec encode et decode
Par défaut, il s’agira d’UTF-8 (8 octets par code point)
Erreur de décodage possible lors d’incompatibilité
UnicodeEncodeError et UnicodeDecodeError
1 s = ’Même pas vrééé !’
2 b = s.encode(’iso -8859 -1 ’)
3 print(b.decode(’utf -8’))
Traceback (most recent call last):
File "test.py", line 3, in <module >
print(b.decode(’utf -8’))
UnicodeDecodeError : ’utf -8’ codec can ’t decode byte 0xea in
position 1: invalid continuation byte
13
Encodage et décodage (2)
Un caractère peut être représenté par plusieurs octets
Dépend évidemment de l’encodage utilisé
14
Classe bytearray
La classe bytearray représente une séquence mutable d’octets
Création à partir d’un str ou bytes
Conversion vers une chaine de caractères avec decode
1 data = bytearray("J’aime les pâtes", ’utf -8’)
2 print(data)
3
4 data [12:14] = b’o’
5 print(data.decode ())
bytearray(b"J’aime les pxc3xa2tes ")
J’aime les potes
15
Classe str
La classe str représente les chaines de caractères
Séquence immuable de caractères Unicode
Pleins de méthodes et opérateurs de manipulation disponibles
1 s = "Hello"
2 t = r’t insère une tabulation ’
3 copy = str(s)
4
5 data = [65, 71, 69]
6 u = bytes(data).decode ()
7
8 print(s, t, copy , u, sep=’n’)
Hello
t insère une tabulation
Hello
AGE
16
Opérateur
Plusieurs opérateurs peuvent être appliqués aux str
Dont tous ceux applicables aux séquences immuables
Méthode Description
len Longueur
+ Concaténation de deux chaines de caractères
in Test de la présence d’une sous-chaine
[] Accès à un caractère ou slicing
* Répétition
1 s = ’Po’
2 r = s * 4 + ’ooo ’
3 print(r) # PoPoPoPoooo
4 print(’op’ in r.lower ()) # True
17
Majuscule/minuscule
Méthode Description
capitalize Copie avec la première lettre convertie en majuscule
upper Copie avec toutes les lettres converties en minuscule
lower Copie avec toutes les lettres converties en majuscule
casefold Comme lower, mais avec remplacement de certains caractères
swapcase Copie avec inversion minuscules/majuscules
title Copie avec première lettre de chaque mot convertie en majuscule
1 s = ’das große Haus ’
2 print(s.capitalize ()) # Das große haus
3 print(s.upper ()) # DAS GROSSE HAUS
4 print(s.lower ()) # das große haus
5 print(s.casefold ()) # das grosse haus
6 print(s.swapcase ()) # DAS GROSSE hAUS
7 print(s.title ()) # Das Große Haus
18
Test
Méthode Description
endswith Teste si la chaine se termine par une suffixe
startswith Teste si la chaine commence par un préfixe
isalnum Teste si la chaine ne contient que des caractères alpha-numériques
isalpha ... alphabétiques
isdigit ... numériques
islower ... minuscules
isupper ... majuscules
1 s = ’große ’
2 print(s.startswith(’g’)) # True
3 print(s.endswith(’E’)) # False
4 print(s.islower ()) # True
5 print(s.isalnum ()) # True
6 print(s.isalpha ()) # True
7 print(s.isdigit ()) # False
19
Recherche
Méthode Description
count Compte le nombre d’occurrence non chevauchées d’une sous-chaine
find Trouve l’indice de la plus petite position d’une sous-chaine
index Comme find, mais ValueError s’il ne trouve pas
rfind Trouve l’indice de la plus grande position d’une sous-chaine
rindex Comme rfind, mais ValueError s’il ne trouve pas
replace Remplace les occurrences d’une sous-chaine par une autre
1 s = ’das große Haus ’
2 print(s.count(’s’)) # 2
3 print(s.find(’s’)) # 2
4 print(s.rfind(’s’)) # 13
5 print(s.index(’A’)) # ValueError
6 print(s.replace(’ ’, ’;’)) # das;große;Haus
20
Mise en page
Méthode Description
ljust Complète pour aligner à gauche dans une largeur spécifiée
center Complète pour centrer dans une largeur spécifiée
rjust Complète pour aligner à droite dans une largeur spécifiée
1 s = ’große ’
2 print(s.ljust (10, ’.’))
3 print(s.center (10, ’_’))
4 print(s.rjust (10))
große .....
__große___
große
21
Découpe
Méthode Description
lstrip Copie avec des caractères à gauche supprimés
rstrip Copie avec des caractères à droite supprimés
lstrip Copie avec des caractères à droite et à gauche supprimés
split Découpe en fonction d’un séparateur
splitlines Découpe en lignes
partition Découpe en trois selon la première occurrence d’un séparateur
rpartition Découpe en trois selon la dernière occurrence d’un séparateur
1 s = ’ grosßsseeeee ’
2 print(s.rstrip(’es’)) # grosß
3 print(s.lstrip ()) # grosßsseeeee
4 print(s.partition(’s’)) # (’ gro ’, ’s’, ’ßsseeeee ’)
5 print(s.rpartition(’s’)) # (’ grosßs ’, ’s’, ’eeeee ’)
22
Fusion
Méthode Description
join Fusionne des chaines de caractères avec un caractère spécifié
1 s = ’Je suis un gros lapin ’
2 words = s.split(’ ’)
3
4 t = ’,’.join(words)
5 print(t)
6 print(’,’.join ([x.upper () for x in words ]))
Je ,suis ,un ,gros ,lapin
JE ,SUIS ,UN ,GROS ,LAPIN
23
Conversion
Donnée vers chaine de caractères avec str
Définir la méthode __str__ pour les nouvelles classes
Chaine de caractères vers une donnée par parsing
Immédiatement ou via une fonction spécifique
1 i = 847
2 s = str(i)
3 print(s, type(s))
4
5 r = ’1,9,2,3,-4,12’
6 data = [int(x) for x in r.split(’,’)]
7 print(data , type(data))
847 <class ’str ’>
[1, 9, 2, 3, -4, 12] <class ’list ’>
24
Concaténation
Plus rapide de passer par join que concaténer
Pour construire des chaines de caractères à incrémentalement
La concaténation crée pleins de nouvelles chaines de caractères
1 def concat(n):
2 result = ’’
3 i = 1
4 while i <= n:
5 result += str(i) + ’,’
6 i += 1
7 return result [: -1]
concat(1000000) ≈ 575 ms
1 def concat(n):
2 elems = []
3 i = 1
4 while i <= n:
5 elems.append(str(i))
6 i += 1
7 return ’,’.join(elems)
concat(1000000) ≈ 454 ms
25
Formatter
Insertion d’une valeur à l’intérieur d’une chaine de caractères
Définition d’un emplacement et spécification d’une valeur
Utilisation de la méthode format sur une chaine
Balises dans la chaine définies avec {}
1 s = "J’ai {age} ans.".format(age =30)
2 print(s)
3
4 d = ’{0}/{1}/{2} ’.format (22, 1, 2016)
5 print(d)
J’ai 30 ans.
22/1/2016
26
Appel des arguments
Format Description
{0} Premier paramètre positionnel
{} Prend implicitement le paramètre positionnel suivant
{name} Paramètre nommé name
0.attr Attribut attr du premier paramètre positionnel
0[0] Premier élément du premier paramètre positionnel
1 from collections import namedtuple
2
3 Point = namedtuple (’Point ’, [’x’, ’y’])
4 p = Point (7, -2)
5 data = [1, 2, 3]
6
7 print(’{0.y} et {1[2]} ’.format(p, data))
-2 et 3
27
Définition du format
Format Description
{:char <n } Texte aligné à gauche, sur largeur de n, rempli avec char
{:char ^n } Texte centré, sur largeur de n, rempli avec char
{:char >n } Texte aligné à droite, sur largeur de n, rempli avec char
{:d} Conversion nombre entier
{:s} Conversion chaine de caractères
{:.precision f} Conversion nombre flottant avec précision après la virgule
1 value = 15.9842
2 print(’{0:f}n{0:.2f}n{0: >10.2f}n{0:* >10.2f}’.format(value))
15.984200
15.98
15.98
*****15.98
28
Template
Construction d’un modèle dans lequel incruster des valeurs
Ajout de balise dans une chaine et insertion avec substitute
Le modèle ne doit être construit qu’une seule fois
Et ensuite réutilisable avec plusieurs valeurs différentes
1 import string
2
3 s = string.Template(’Bonjour $prenom $nom ’)
4
5 print(s.substitute(prenom=’Quentin ’, nom=’Lurkin ’))
Bonjour Quentin Lurkin
29
Encodage fichier source
Par défaut, code source fichier Python en UTF-8
Depuis Python 3 uniquement, ASCII en Python 2
Possibilité de déclarer l’encodage du fichier
Utilisation d’un commentaire spécial en début de fichier
1 # -*- coding: windows -1252 -*-
2
3 # blabla ...
30
Expressions régulières
Validation de données
Important de valider les inputs
Données entrées par le user, provenant de fichiers, du réseau...
Formatage des données
Via un parser qui produit une erreur en cas de format invalide
Vérifier les données avec une expression régulière (module re)
La donnée suit-elle un motif prédéfini ?
32
Exemple : Numéro de téléphone
Numéro de téléphone de la forme xxxx/xx.xx.xx
Où les x sont des chiffres
[0-9]{4}/[0-9]{2}.[0-9]{2}.[0-9]{2}
deux chiffres entre 0 et 9
quatre chiffres entre 0 et 9 un slash un point
1 pattern = r’[0 -9]{4}/[0 -9]{2}.[0 -9]{2}.[0 -9]{2} ’
2 p = re.compile(pattern)
3
4 print(p.match(’0394/83.31.41 ’))
5 print(p.match(’0394/83 -31 -41 ’))
<_sre.SRE_Match object; span =(0, 13) , match = ’0394/83.31.41 ’ >
None
33
Vérifier une chaine (1)
Définition d’un motif représentant les chaines valides
En utilisant une expression régulière
Compilation du motif avec la fonction re.compile
Renvoie un objet de type regex
Vérification d’une chaine de caractères avec la méthode match
Renvoie None si invalide, et un objet décrivant le match sinon
34
Description de motif (1)
Précéder les méta-caractères avec un backslash
. ^ $ * + ? { } [ ]  | ( )
Classes de caractères définies avec les [ ]
[abc] : a, b ou c
[0-9] : n’importe quoi entre 0 et 9
[a-zA-Z] : n’importe quoi entre a et z ou entre A et Z
[^aeiou] : n’importe quoi sauf a, e, i, o ou u
[a-z&&[^b]] : intersection entre deux ensembles
Classes prédéfinies de caractères
. : n’importe quel caractère (sauf retour à la ligne)
d : un chiffre (équivalent à [0-9])
s : un caractère blanc (équivalent à [ tnrfv])
w : un caractère alpha-numérique (équivalent à [a-zA-Z0-9_])
35
Description de motif (2)
Répétitions d’occurrences avec une quantificateur
{n} : exactement n occurrences
{m,n} : au moins m et au plus n occurrences
{m,} : au moins m occurrences
{,n} : au plus n occurrences
Quantificateurs prédéfinis
? = {0,1}
* = {0,}
+ = {1,}
Frontières de recherche
^ : début de la ligne
$ : fin de la ligne
36
Exemple : Nombre entier
Nombre entier avec éventuellement un signe −
Le premier chiffre est non nul
-?[1-9][0-9]*
un chiffre entre 1 et 9
un signe (optionnel) zéro, un ou plusieurs chiffres entre 0 et 9
1 pattern = r’ -?[1 -9][0 -9]* ’
2 p = re.compile(pattern)
3
4 print(p.match(’15’) is not None) # True
5 print(p.match(’03’) is not None) # False
6 print(p.match(’-7’) is not None) # True
7 print(p.match(’ -42’) is not None) # True
8
9 print(p.match(’8 enfants !’) is not None) # True
37
Vérifier une chaine (2)
Vérifier le contenu d’une chaine avec les frontières
La méthode match cherche à partir du début de la chaine
^ matche le début de la chaine et $ la fin
S’assure qu’une chaine complète suit un motif
1 pattern = r’ -?[1 -9][0 -9]* ’
2 p = re.compile(pattern)
3
4 print(p.match(’8 enfants !’) is not None) # False
38
Options de compilation
Flags à passer à la méthode compile
Constantes définies dans le module re, à combiner avec |
Flag Description
re.IGNORECASE Recherche insensible à la casse
re.DOTALL Le point matche également les retours à la ligne
re.MULTILINE Les matches peuvent se faire sur plusieurs lignes
1 pattern = r’^[a-z]+$’
2 p = re.compile(pattern , re.IGNORECASE)
3
4 print(p.match(’bogoss ’) is not None) # True
5 print(p.match(’LaTeX ’) is not None) # True
39
La peste du backslash
Utilisation recommandée des chaines brutes
Sinon, de nombreux soucis avec le backslash
Nom de commande LATEX
Regex Description
[a-zA-Z]+ Nom d’une commande
[a-zA-Z]+ Échappement du  pour compile
[a-zA-Z]+ Construction d’un littéral str
1 p = re.compile(’([a-zA -Z]+) ’) # re.compile(r ’([a-zA -Z]+) ’)
2 m = p.match(’ LaTeX ’)
3 if m is not None:
4 print(m.group (1))
40
Rechercher un motif (1)
La méthode match renvoie un objet du match
Plusieurs méthodes pour obtenir des informations sur le match
Méthode Description
group Renvoie la sous-chaine matchée
start Renvoie la position du début du match
end Renvoie la position de la fin du match
span Renvoie un tuple avec les positions de début et de fin du match
1 pattern = r’d+’
2 p = re.compile(pattern)
3
4 m = p.match(’72 est égal à 70 + 2’)
5 if m is not None:
6 print(m.group ()) # 72
41
Rechercher un motif (2)
search cherche un motif dans une chaine
Recherche d’une sous-chaine qui matche le motif
findall recherche toutes les sous-chaines qui matchent
Renvoie une liste des sous-chaines matchées
1 pattern = r’d+’
2 p = re.compile(pattern)
3
4 m = p.search(’on sait que 72 est égal à 70 + 2’)
5 if m is not None:
6 print(m.group ()) # 72
7
8 print(p.findall(’72 est égal à 70 + 2’)) # [’72’, ’70’, ’2’]
42
Rechercher un motif (3)
finditer renvoie un itérateur d’objets de match
On peut ainsi parcourir les matchs avec une boucle for
1 pattern = r’d+’
2 p = re.compile(pattern)
3
4 for m in p.finditer(’on sait que 72 est égal à 70 + 2’):
5 print(m.span (), ’:’, m.group ())
(12, 14) : 72
(26, 28) : 70
(31, 32) : 2
43
Choix
Alternative entre plusieurs motifs avec |
Représente l’opérateur « ou »
1 pattern = r’^[0 -9]+|[a-z]+$’
2 p = re.compile(pattern)
3
4 print(p.match(’283’) is not None)
5 print(p.match(’boat ’) is not None)
6 print(p.match(’boat283 ’) is not None)
True
True
False
44
Capturer des groupes
Disséquer une chaine en sous-chaines matchantes
Pouvoir extraire plusieurs parties d’une chaine donnée
Définition de groupes dans le motif avec des ( )
Chaque groupe représente un sous-motif
1 pattern = r’^([a-z]+)@([a-z]+) .([a-z]{2 ,3})$’
2 p = re.compile(pattern)
3
4 m = p.match(’email@example .net ’)
5 if m is not None:
6 print(m.groups ()) # (’email ’, ’example ’, ’net ’)
7 print(m.group (1)) # email
45
Option de capture des groupes
Option avec point d’interrogation après la parenthèse ouvrante
Ce qui suit le ? décrit l’option
Option spécifique à Python avec (?P...)
Indique une option pas présente dans la syntaxe PERL
Groupe non capturant avec l’option :
Permet d’appliquer un quantificateur sur un sous-motif
1 pattern = r’^(?:[0 -9]+)$’
2 p = re.compile(pattern)
3
4 m = p.match(’283 ’)
5 if m is not None:
6 print(m.groups ()) # ()
46
Groupe nommé
Possibilité de nommer un groupe avec les options Python
Le groupe est récupéré avec son nom plutôt que sa position
1 pattern = r’^(?P<pseudo >[a-z]+)@(?P<domain >[a-z]+) .(?P<extension >[
a-z]{2 ,3})$’
2 p = re.compile(pattern)
3
4 m = p.match(’email@example .net ’)
5 if m is not None:
6 print(m.groups ())
7 print(m.group (1))
8 print(m.group(’domain ’))
(’email ’, ’example ’, ’net ’)
email
example
47
Exemple : Extraction de liens (1)
Extraction des adresses de liens dans une page HTML
Retrouver la valeur de l’attribut href des éléments a
Utilisation du motif <a.*href="(.*)".*>
1 pattern = r’<a.* href ="(.*) ".*>’
2 p = re.compile(pattern , re.MULTILINE)
3
4 for m in p.finditer(’’’<a href =" http :// www.google.be" rel=" popup"
class =" extlink">
5 <a target =" _blank" href =" http :// www.yahoo.be" class =" extlink" rel ="
popup">
6 <a href =" http :// www.alltheweb.com">’’’):
7 print(m.group (1))
http :// www.google.be" rel=" popup" class =" extlink
http :// www.yahoo.be" class =" extlink" rel =" popup
http :// www.alltheweb.com
48
Exemple : Extraction de liens (2)
Solution 1 : Ne pas capturer " dans l’URL
Utilisation du motif <a.*href="([^"]*)".*>
Solution 2 : Utilisation des quantificateurs non greedy
Capturent le moins possible (ajout d’un ? derrière)
1 pattern = r’<a.* href ="(.*?) ".*>’
2 p = re.compile(pattern , re.MULTILINE)
3
4 # ...
http :// www.google.be
http :// www.yahoo.be
http :// www.alltheweb.com
49
Référence en arrière
On peut faire référence à un groupe précédemment capturé
 suivi du numéro du groupe
Permet par exemple la recherche de répétitions de mot
Capture d’un mot suivi de blancs (s) et du même mot
1 p = re.compile(r’([a-z]+)s+1 ’)
2 m = p.search(’Il a une une pomme ’)
3 if m is not None:
4 print(m.group ())
une une
50
Découpe de chaine
La méthode split découpe une chaine selon un motif
Permet d’avoir une expression régulière comme séparateur
1 pattern = r’[ ,;.?! -]+’
2 p = re.compile(pattern)
3
4 words = p.split(’Bonjour ! Comment allez -vous ?’)
5 print(words)
[’Bonjour ’, ’Comment ’, ’allez ’, ’vous ’, ’’]
51
Liens
RegexLib, http://www.regexlib.com/
Recueil d’expressions régulières
Regex 101, https://regex101.com/
Testeur en ligne d’expressions régulières
Regex Crossword, https://regexcrossword.com/
Jeu en ligne pour apprendre les expressions régulières
52
Crédits
https://www.flickr.com/photos/b-tal/151881566
https://www.flickr.com/photos/strathmeyer/7200873702
53

Mais conteúdo relacionado

Mais procurados

Développement informatique : Algorithmique I : Récursion et arbre
Développement informatique : Algorithmique I : Récursion et arbreDéveloppement informatique : Algorithmique I : Récursion et arbre
Développement informatique : Algorithmique I : Récursion et arbreECAM Brussels Engineering School
 
Python avancé : Interface graphique et programmation évènementielle
Python avancé : Interface graphique et programmation évènementiellePython avancé : Interface graphique et programmation évènementielle
Python avancé : Interface graphique et programmation évènementielleECAM Brussels Engineering School
 
Introduction à Python - Achraf Kacimi El Hassani
Introduction à Python - Achraf Kacimi El HassaniIntroduction à Python - Achraf Kacimi El Hassani
Introduction à Python - Achraf Kacimi El HassaniShellmates
 
Cours python avancé
Cours python avancéCours python avancé
Cours python avancépierrepo
 
Les fondamentaux du langage C
Les fondamentaux du langage CLes fondamentaux du langage C
Les fondamentaux du langage CAbdoulaye Dieng
 
Python For Data Science - French Course
Python For Data Science - French CoursePython For Data Science - French Course
Python For Data Science - French CourseHaytam EL YOUSSFI
 
Initiation à l'algorithmique
Initiation à l'algorithmiqueInitiation à l'algorithmique
Initiation à l'algorithmiqueAbdoulaye Dieng
 
.php1 : les fondamentaux du PHP
.php1 : les fondamentaux du PHP.php1 : les fondamentaux du PHP
.php1 : les fondamentaux du PHPAbdoulaye Dieng
 
Scala : programmation fonctionnelle
Scala : programmation fonctionnelleScala : programmation fonctionnelle
Scala : programmation fonctionnelleMICHRAFY MUSTAFA
 
Programmation fonctionnelle
Programmation fonctionnelleProgrammation fonctionnelle
Programmation fonctionnelleGeeks Anonymes
 

Mais procurados (20)

Développement informatique : Algorithmique I : Récursion et arbre
Développement informatique : Algorithmique I : Récursion et arbreDéveloppement informatique : Algorithmique I : Récursion et arbre
Développement informatique : Algorithmique I : Récursion et arbre
 
Composition, agrégation et immuabilité
Composition, agrégation et immuabilitéComposition, agrégation et immuabilité
Composition, agrégation et immuabilité
 
Python avancé : Interface graphique et programmation évènementielle
Python avancé : Interface graphique et programmation évènementiellePython avancé : Interface graphique et programmation évènementielle
Python avancé : Interface graphique et programmation évènementielle
 
Python avancé : Lecture et écriture de fichiers
Python avancé : Lecture et écriture de fichiersPython avancé : Lecture et écriture de fichiers
Python avancé : Lecture et écriture de fichiers
 
Python avancé : Classe et objet
Python avancé : Classe et objetPython avancé : Classe et objet
Python avancé : Classe et objet
 
Polymorphisme, interface et classe abstraite
Polymorphisme, interface et classe abstraitePolymorphisme, interface et classe abstraite
Polymorphisme, interface et classe abstraite
 
Introduction à Python - Achraf Kacimi El Hassani
Introduction à Python - Achraf Kacimi El HassaniIntroduction à Python - Achraf Kacimi El Hassani
Introduction à Python - Achraf Kacimi El Hassani
 
Tests unitaires : Utilisation de la librairie CUnit
Tests unitaires : Utilisation de la librairie CUnitTests unitaires : Utilisation de la librairie CUnit
Tests unitaires : Utilisation de la librairie CUnit
 
Cours python avancé
Cours python avancéCours python avancé
Cours python avancé
 
Type abstrait de données
Type abstrait de donnéesType abstrait de données
Type abstrait de données
 
Les fondamentaux du langage C
Les fondamentaux du langage CLes fondamentaux du langage C
Les fondamentaux du langage C
 
Python For Data Science - French Course
Python For Data Science - French CoursePython For Data Science - French Course
Python For Data Science - French Course
 
Formation python
Formation pythonFormation python
Formation python
 
Initiation à l'algorithmique
Initiation à l'algorithmiqueInitiation à l'algorithmique
Initiation à l'algorithmique
 
Introduction à Python
Introduction à PythonIntroduction à Python
Introduction à Python
 
.php1 : les fondamentaux du PHP
.php1 : les fondamentaux du PHP.php1 : les fondamentaux du PHP
.php1 : les fondamentaux du PHP
 
Développement informatique : Programmation graphique
Développement informatique : Programmation graphiqueDéveloppement informatique : Programmation graphique
Développement informatique : Programmation graphique
 
Scala : programmation fonctionnelle
Scala : programmation fonctionnelleScala : programmation fonctionnelle
Scala : programmation fonctionnelle
 
Programmation Fonctionnelle
Programmation FonctionnelleProgrammation Fonctionnelle
Programmation Fonctionnelle
 
Programmation fonctionnelle
Programmation fonctionnelleProgrammation fonctionnelle
Programmation fonctionnelle
 

Destaque

la contribution de la résilience organisationnelle et l'agilité organisationn...
la contribution de la résilience organisationnelle et l'agilité organisationn...la contribution de la résilience organisationnelle et l'agilité organisationn...
la contribution de la résilience organisationnelle et l'agilité organisationn...najwa sabouk
 
Découvrir et utiliser Git : le logiciel de gestion de versions décentralisé
Découvrir et utiliser Git : le logiciel de gestion de versions décentraliséDécouvrir et utiliser Git : le logiciel de gestion de versions décentralisé
Découvrir et utiliser Git : le logiciel de gestion de versions décentraliséECAM Brussels Engineering School
 
De la Terre aux Étoiles : Mesure des distances Terre-Étoile
De la Terre aux Étoiles : Mesure des distances Terre-ÉtoileDe la Terre aux Étoiles : Mesure des distances Terre-Étoile
De la Terre aux Étoiles : Mesure des distances Terre-ÉtoileECAM Brussels Engineering School
 
Développement informatique : Gestion de projet, versioning, debugging, testin...
Développement informatique : Gestion de projet, versioning, debugging, testin...Développement informatique : Gestion de projet, versioning, debugging, testin...
Développement informatique : Gestion de projet, versioning, debugging, testin...ECAM Brussels Engineering School
 
Laboratoire de transmission numérique : Présentation du projet
Laboratoire de transmission numérique : Présentation du projetLaboratoire de transmission numérique : Présentation du projet
Laboratoire de transmission numérique : Présentation du projetECAM Brussels Engineering School
 
Réseaux des neurones
Réseaux des neuronesRéseaux des neurones
Réseaux des neuronesMed Zaibi
 
Programmation de systèmes embarqués : Introduction aux systèmes embarqués
Programmation de systèmes embarqués : Introduction aux systèmes embarquésProgrammation de systèmes embarqués : Introduction aux systèmes embarqués
Programmation de systèmes embarqués : Introduction aux systèmes embarquésECAM Brussels Engineering School
 
Programmation de systèmes embarqués : Systèmes temps réel et PRUSS
Programmation de systèmes embarqués : Systèmes temps réel et PRUSSProgrammation de systèmes embarqués : Systèmes temps réel et PRUSS
Programmation de systèmes embarqués : Systèmes temps réel et PRUSSECAM Brussels Engineering School
 
Programmation de systèmes embarqués : Bus et périphériques de communication
Programmation de systèmes embarqués : Bus et périphériques de communicationProgrammation de systèmes embarqués : Bus et périphériques de communication
Programmation de systèmes embarqués : Bus et périphériques de communicationECAM Brussels Engineering School
 
Introduction à LaTeX : le système de composition professionnel
Introduction à LaTeX : le système de composition professionnelIntroduction à LaTeX : le système de composition professionnel
Introduction à LaTeX : le système de composition professionnelECAM Brussels Engineering School
 
Programmation de systèmes embarqués : Internet of Things : système connecté e...
Programmation de systèmes embarqués : Internet of Things : système connecté e...Programmation de systèmes embarqués : Internet of Things : système connecté e...
Programmation de systèmes embarqués : Internet of Things : système connecté e...ECAM Brussels Engineering School
 

Destaque (18)

la contribution de la résilience organisationnelle et l'agilité organisationn...
la contribution de la résilience organisationnelle et l'agilité organisationn...la contribution de la résilience organisationnelle et l'agilité organisationn...
la contribution de la résilience organisationnelle et l'agilité organisationn...
 
Découvrir et utiliser Git : le logiciel de gestion de versions décentralisé
Découvrir et utiliser Git : le logiciel de gestion de versions décentraliséDécouvrir et utiliser Git : le logiciel de gestion de versions décentralisé
Découvrir et utiliser Git : le logiciel de gestion de versions décentralisé
 
De la Terre aux Étoiles : Mesure des distances Terre-Étoile
De la Terre aux Étoiles : Mesure des distances Terre-ÉtoileDe la Terre aux Étoiles : Mesure des distances Terre-Étoile
De la Terre aux Étoiles : Mesure des distances Terre-Étoile
 
Modélisation avec UML
Modélisation avec UMLModélisation avec UML
Modélisation avec UML
 
Outils de gestion de projets
Outils de gestion de projetsOutils de gestion de projets
Outils de gestion de projets
 
Arbre et algorithme de recherche
Arbre et algorithme de rechercheArbre et algorithme de recherche
Arbre et algorithme de recherche
 
Développement informatique : Gestion de projet, versioning, debugging, testin...
Développement informatique : Gestion de projet, versioning, debugging, testin...Développement informatique : Gestion de projet, versioning, debugging, testin...
Développement informatique : Gestion de projet, versioning, debugging, testin...
 
Développement informatique : Programmation réseau
Développement informatique : Programmation réseauDéveloppement informatique : Programmation réseau
Développement informatique : Programmation réseau
 
Laboratoire de transmission numérique : Présentation du projet
Laboratoire de transmission numérique : Présentation du projetLaboratoire de transmission numérique : Présentation du projet
Laboratoire de transmission numérique : Présentation du projet
 
UKO-JAVA1001-slides
UKO-JAVA1001-slidesUKO-JAVA1001-slides
UKO-JAVA1001-slides
 
Réseaux des neurones
Réseaux des neuronesRéseaux des neurones
Réseaux des neurones
 
Programmation de systèmes embarqués : Introduction aux systèmes embarqués
Programmation de systèmes embarqués : Introduction aux systèmes embarquésProgrammation de systèmes embarqués : Introduction aux systèmes embarqués
Programmation de systèmes embarqués : Introduction aux systèmes embarqués
 
Développement informatique : Programmation concurrente
Développement informatique : Programmation concurrenteDéveloppement informatique : Programmation concurrente
Développement informatique : Programmation concurrente
 
Programmation de systèmes embarqués : Systèmes temps réel et PRUSS
Programmation de systèmes embarqués : Systèmes temps réel et PRUSSProgrammation de systèmes embarqués : Systèmes temps réel et PRUSS
Programmation de systèmes embarqués : Systèmes temps réel et PRUSS
 
Programmation de systèmes embarqués : Bus et périphériques de communication
Programmation de systèmes embarqués : Bus et périphériques de communicationProgrammation de systèmes embarqués : Bus et périphériques de communication
Programmation de systèmes embarqués : Bus et périphériques de communication
 
Introduction à LaTeX : le système de composition professionnel
Introduction à LaTeX : le système de composition professionnelIntroduction à LaTeX : le système de composition professionnel
Introduction à LaTeX : le système de composition professionnel
 
Comment Internet fonctionne-t-il ?
Comment Internet fonctionne-t-il ?Comment Internet fonctionne-t-il ?
Comment Internet fonctionne-t-il ?
 
Programmation de systèmes embarqués : Internet of Things : système connecté e...
Programmation de systèmes embarqués : Internet of Things : système connecté e...Programmation de systèmes embarqués : Internet of Things : système connecté e...
Programmation de systèmes embarqués : Internet of Things : système connecté e...
 

Semelhante a Développement informatique : Chaines de caractères et expressions regulières

ch7_les chaines de caractères.pdf
ch7_les chaines de caractères.pdfch7_les chaines de caractères.pdf
ch7_les chaines de caractères.pdfFadouaBouafifSamoud
 
Formation python
Formation pythonFormation python
Formation pythonj_lipaz
 
cours lanagage c avec des exemples d'application
cours lanagage c avec des exemples d'applicationcours lanagage c avec des exemples d'application
cours lanagage c avec des exemples d'applicationkamalomari2
 
ALF 3 - Expressions régulières et Lexer
ALF 3 - Expressions régulières et Lexer ALF 3 - Expressions régulières et Lexer
ALF 3 - Expressions régulières et Lexer Alexandru Radovici
 
Chapitre 2: String en Java
Chapitre 2:  String en JavaChapitre 2:  String en Java
Chapitre 2: String en JavaAziz Darouichi
 
Les nouveautés de Java 21 - Devoxx MA 2023.pdf
Les nouveautés de Java 21 - Devoxx MA 2023.pdfLes nouveautés de Java 21 - Devoxx MA 2023.pdf
Les nouveautés de Java 21 - Devoxx MA 2023.pdfJean-Michel Doudoux
 
Les nouveautés de Java 21 - Rencontres dev Toulon octobre 2023.pdf
Les nouveautés de Java 21 - Rencontres dev Toulon octobre 2023.pdfLes nouveautés de Java 21 - Rencontres dev Toulon octobre 2023.pdf
Les nouveautés de Java 21 - Rencontres dev Toulon octobre 2023.pdfJean-Michel Doudoux
 
Redis - (nosqlfr meetup #2)
Redis - (nosqlfr meetup #2) Redis - (nosqlfr meetup #2)
Redis - (nosqlfr meetup #2) Frank Denis
 
Data Mining (Partie 2).pdf
Data Mining (Partie 2).pdfData Mining (Partie 2).pdf
Data Mining (Partie 2).pdfOuailChoukhairi
 
Seance 4- Programmation en langage C
Seance 4- Programmation en langage CSeance 4- Programmation en langage C
Seance 4- Programmation en langage CFahad Golra
 
SdE 2 - Langage C, Allocation de memoire
SdE 2 - Langage C, Allocation de memoireSdE 2 - Langage C, Allocation de memoire
SdE 2 - Langage C, Allocation de memoireAlexandru Radovici
 
Formation python micro club.net
Formation python micro club.netFormation python micro club.net
Formation python micro club.netZakaria SMAHI
 
dokumen.tips_cours-3-chiffrement-par-bloc-cole-normale-ferradi-1997-le-des-co...
dokumen.tips_cours-3-chiffrement-par-bloc-cole-normale-ferradi-1997-le-des-co...dokumen.tips_cours-3-chiffrement-par-bloc-cole-normale-ferradi-1997-le-des-co...
dokumen.tips_cours-3-chiffrement-par-bloc-cole-normale-ferradi-1997-le-des-co...SamiraElMargae1
 
Oracle : extension du langage SQL
Oracle : extension du langage SQLOracle : extension du langage SQL
Oracle : extension du langage SQLMohammed Jaafar
 
En route vers Java 21 - Javaday Paris 2023
En route vers Java 21 - Javaday Paris 2023En route vers Java 21 - Javaday Paris 2023
En route vers Java 21 - Javaday Paris 2023Jean-Michel Doudoux
 
Introduction à l'analyse de réseaux avec R
Introduction à l'analyse de réseaux avec RIntroduction à l'analyse de réseaux avec R
Introduction à l'analyse de réseaux avec RLaurent Beauguitte
 

Semelhante a Développement informatique : Chaines de caractères et expressions regulières (20)

COURS_PYTHON_22.ppt
COURS_PYTHON_22.pptCOURS_PYTHON_22.ppt
COURS_PYTHON_22.ppt
 
ch7_les chaines de caractères.pdf
ch7_les chaines de caractères.pdfch7_les chaines de caractères.pdf
ch7_les chaines de caractères.pdf
 
Initiation r
Initiation rInitiation r
Initiation r
 
Formation python
Formation pythonFormation python
Formation python
 
Chaines cours exo
Chaines cours exoChaines cours exo
Chaines cours exo
 
cours lanagage c avec des exemples d'application
cours lanagage c avec des exemples d'applicationcours lanagage c avec des exemples d'application
cours lanagage c avec des exemples d'application
 
ALF 3 - Expressions régulières et Lexer
ALF 3 - Expressions régulières et Lexer ALF 3 - Expressions régulières et Lexer
ALF 3 - Expressions régulières et Lexer
 
Chapitre 2: String en Java
Chapitre 2:  String en JavaChapitre 2:  String en Java
Chapitre 2: String en Java
 
Les nouveautés de Java 21 - Devoxx MA 2023.pdf
Les nouveautés de Java 21 - Devoxx MA 2023.pdfLes nouveautés de Java 21 - Devoxx MA 2023.pdf
Les nouveautés de Java 21 - Devoxx MA 2023.pdf
 
Les nouveautés de Java 21 - Rencontres dev Toulon octobre 2023.pdf
Les nouveautés de Java 21 - Rencontres dev Toulon octobre 2023.pdfLes nouveautés de Java 21 - Rencontres dev Toulon octobre 2023.pdf
Les nouveautés de Java 21 - Rencontres dev Toulon octobre 2023.pdf
 
Redis - (nosqlfr meetup #2)
Redis - (nosqlfr meetup #2) Redis - (nosqlfr meetup #2)
Redis - (nosqlfr meetup #2)
 
Implementing a key/value store
Implementing a key/value storeImplementing a key/value store
Implementing a key/value store
 
Data Mining (Partie 2).pdf
Data Mining (Partie 2).pdfData Mining (Partie 2).pdf
Data Mining (Partie 2).pdf
 
Seance 4- Programmation en langage C
Seance 4- Programmation en langage CSeance 4- Programmation en langage C
Seance 4- Programmation en langage C
 
SdE 2 - Langage C, Allocation de memoire
SdE 2 - Langage C, Allocation de memoireSdE 2 - Langage C, Allocation de memoire
SdE 2 - Langage C, Allocation de memoire
 
Formation python micro club.net
Formation python micro club.netFormation python micro club.net
Formation python micro club.net
 
dokumen.tips_cours-3-chiffrement-par-bloc-cole-normale-ferradi-1997-le-des-co...
dokumen.tips_cours-3-chiffrement-par-bloc-cole-normale-ferradi-1997-le-des-co...dokumen.tips_cours-3-chiffrement-par-bloc-cole-normale-ferradi-1997-le-des-co...
dokumen.tips_cours-3-chiffrement-par-bloc-cole-normale-ferradi-1997-le-des-co...
 
Oracle : extension du langage SQL
Oracle : extension du langage SQLOracle : extension du langage SQL
Oracle : extension du langage SQL
 
En route vers Java 21 - Javaday Paris 2023
En route vers Java 21 - Javaday Paris 2023En route vers Java 21 - Javaday Paris 2023
En route vers Java 21 - Javaday Paris 2023
 
Introduction à l'analyse de réseaux avec R
Introduction à l'analyse de réseaux avec RIntroduction à l'analyse de réseaux avec R
Introduction à l'analyse de réseaux avec R
 

Mais de ECAM Brussels Engineering School

Mais de ECAM Brussels Engineering School (6)

Introduction à la formation Digitalent
Introduction à la formation DigitalentIntroduction à la formation Digitalent
Introduction à la formation Digitalent
 
Programmation de systèmes embarqués : BeagleBone Black et Linux embarqué
Programmation de systèmes embarqués : BeagleBone Black et Linux embarquéProgrammation de systèmes embarqués : BeagleBone Black et Linux embarqué
Programmation de systèmes embarqués : BeagleBone Black et Linux embarqué
 
Développement informatique : Algorithmique II : Techniques de recherche en in...
Développement informatique : Algorithmique II : Techniques de recherche en in...Développement informatique : Algorithmique II : Techniques de recherche en in...
Développement informatique : Algorithmique II : Techniques de recherche en in...
 
Intelligence Artificielle : Introduction à l'intelligence artificielle
Intelligence Artificielle : Introduction à l'intelligence artificielleIntelligence Artificielle : Introduction à l'intelligence artificielle
Intelligence Artificielle : Introduction à l'intelligence artificielle
 
Qualité de code et bonnes pratiques
Qualité de code et bonnes pratiquesQualité de code et bonnes pratiques
Qualité de code et bonnes pratiques
 
HTML, CSS et Javascript
HTML, CSS et JavascriptHTML, CSS et Javascript
HTML, CSS et Javascript
 

Développement informatique : Chaines de caractères et expressions regulières

  • 1. PI2T Développement informatique Séance 3 Chaines de caractères et expressions régulières Sébastien Combéfis, Quentin Lurkin 22 février 2016
  • 2. Ce(tte) œuvre est mise à disposition selon les termes de la Licence Creative Commons Attribution – Pas d’Utilisation Commerciale – Pas de Modification 4.0 International.
  • 3. Objectifs Manipulation de chaines de caractères La classe str Fonctions dans la librairie standard Optimisations pour la manipulation de chaines Utilisation des expressions régulières Vérifier qu’une chaine de caractères matche un motif Chercher des sous-chaines correspondant à un motif Extraire des sous-chaines correspondant à un motif 3
  • 5. Séquence de caractères Une chaine de caractères est une séquence non modifiable Séquence de caractères Unicode Opérations d’accès des séquences utilisables Longueur, accès, slicing, appartenance (in), parcours (for) 1 s = ’Hello world!’ 2 3 print(len(s)) # 12 4 print(s[0]) # H 5 print(s[0:4]) # Hell 6 print(’ ’ in s) # True 7 for c in s: # Helloworld! 8 if c != ’ ’: 9 print(c, end=’’) 5
  • 6. Littéraux Littéraux sur une ligne délimités par ’ ou " Choix libre du simple ou double guillemet Littéraux étendus sur plusieurs lignes avec triples guillemets Notamment utilisés pour la documentation 1 question = "Where ’s my Maneki -neko?" 2 3 affirmation = ’You can call me "The Beast "!’ 4 5 haiku = """ Yesterday it worked. 6 Today it is not working. 7 Windows is like that.""" Plus de haikus pour programmeurs ici : http://www.libertybasicuniversity.com/lbnews/nl107/haiku.htm. 6
  • 7. Séquence d’échappement (1) Séquence d’échappement pour insérer certains caractères Utilisation du caractère d’échappement Caractères spéciaux ou spécification de la valeur Unicode Caractère Unicode spécifié par sa valeur en hexadécimal 1 s = ’Courses :n- DVDt12 .99 u20acn- Cafét1 .50 u20ac ’ 2 print(s) Courses: - DVD 12.99e - Café 1.50e 7
  • 8. Séquence d’échappement (2) Quelques exemples de séquences d’échappement Certaines sont associées à une valeur Séquence Description nouvelle_ligne Ignorer la nouvelle ligne Backslash ’ Guillemet simple " Guillemet double b Backspace a Cloche n Nouvelle ligne r Retour chariot t Tabulation horizontale xhh Caractère avec la valeur hexadécimale sur 8 bits hh uhhhh Caractère avec la valeur hexadécimale sur 16 bits hhhh 8
  • 9. Exemple : Compte à rebours Pause dans l’exécution du programme avec time.sleep Temps d’attente précisé en secondes Effacer le texte dans le terminal avec b Forcer l’écriture avec sys.stdout.flush() 1 import sys 2 import time 3 4 counter = 5 5 while counter > 0: 6 print(’b{}’.format(counter), end=’’) 7 sys.stdout.flush () 8 counter -= 1 9 time.sleep (1) 10 print(’bBOOM!’) 9
  • 10. Chaine de caractères brute Séquences d’échappement ignorées dans les chaines brutes Les caractères d’une chaine brute sont pris tels quels Définie avec le caractère r avant le guillemet ouvrant 1 print(r’Utilisez u20ac pour ’ + ’insérer un u20ac !’) Utilisez u20ac pour insérer un e ! 10
  • 11. Classe bytes Objet bytes est une séquence d’entiers entre 0 et 255 Représentation en mémoire d’une chaine de caractères Unicode Littéral bytes déclaré en préfixant la chaine avec b Ne fonctionne qu’avec les caractères ASCII 1 b = b’Listening Nightcore!’ 2 print(b) 3 print(type(b)) 4 print(b[0]) b’Listening Nightcore!’ <class ’bytes ’> 76 11
  • 12. byte et str On ne mélange pas des byte et str dans une même opération Erreur de type incompatible générée par l’interpréteur Python Conversion possible d’un type vers l’autre Utilisation des méthodes encode et decode 1 s = ’Hello ’ 2 b = b’World!’ 3 4 print(s + ’ ’ + b) Traceback (most recent call last): File "test.py", line 4, in <module > print(s + ’ ’ + b) TypeError: Can ’t convert ’bytes ’ object to str implicitly 12
  • 13. Encodage et décodage (1) Spécification de l’encodage à utiliser avec encode et decode Par défaut, il s’agira d’UTF-8 (8 octets par code point) Erreur de décodage possible lors d’incompatibilité UnicodeEncodeError et UnicodeDecodeError 1 s = ’Même pas vrééé !’ 2 b = s.encode(’iso -8859 -1 ’) 3 print(b.decode(’utf -8’)) Traceback (most recent call last): File "test.py", line 3, in <module > print(b.decode(’utf -8’)) UnicodeDecodeError : ’utf -8’ codec can ’t decode byte 0xea in position 1: invalid continuation byte 13
  • 14. Encodage et décodage (2) Un caractère peut être représenté par plusieurs octets Dépend évidemment de l’encodage utilisé 14
  • 15. Classe bytearray La classe bytearray représente une séquence mutable d’octets Création à partir d’un str ou bytes Conversion vers une chaine de caractères avec decode 1 data = bytearray("J’aime les pâtes", ’utf -8’) 2 print(data) 3 4 data [12:14] = b’o’ 5 print(data.decode ()) bytearray(b"J’aime les pxc3xa2tes ") J’aime les potes 15
  • 16. Classe str La classe str représente les chaines de caractères Séquence immuable de caractères Unicode Pleins de méthodes et opérateurs de manipulation disponibles 1 s = "Hello" 2 t = r’t insère une tabulation ’ 3 copy = str(s) 4 5 data = [65, 71, 69] 6 u = bytes(data).decode () 7 8 print(s, t, copy , u, sep=’n’) Hello t insère une tabulation Hello AGE 16
  • 17. Opérateur Plusieurs opérateurs peuvent être appliqués aux str Dont tous ceux applicables aux séquences immuables Méthode Description len Longueur + Concaténation de deux chaines de caractères in Test de la présence d’une sous-chaine [] Accès à un caractère ou slicing * Répétition 1 s = ’Po’ 2 r = s * 4 + ’ooo ’ 3 print(r) # PoPoPoPoooo 4 print(’op’ in r.lower ()) # True 17
  • 18. Majuscule/minuscule Méthode Description capitalize Copie avec la première lettre convertie en majuscule upper Copie avec toutes les lettres converties en minuscule lower Copie avec toutes les lettres converties en majuscule casefold Comme lower, mais avec remplacement de certains caractères swapcase Copie avec inversion minuscules/majuscules title Copie avec première lettre de chaque mot convertie en majuscule 1 s = ’das große Haus ’ 2 print(s.capitalize ()) # Das große haus 3 print(s.upper ()) # DAS GROSSE HAUS 4 print(s.lower ()) # das große haus 5 print(s.casefold ()) # das grosse haus 6 print(s.swapcase ()) # DAS GROSSE hAUS 7 print(s.title ()) # Das Große Haus 18
  • 19. Test Méthode Description endswith Teste si la chaine se termine par une suffixe startswith Teste si la chaine commence par un préfixe isalnum Teste si la chaine ne contient que des caractères alpha-numériques isalpha ... alphabétiques isdigit ... numériques islower ... minuscules isupper ... majuscules 1 s = ’große ’ 2 print(s.startswith(’g’)) # True 3 print(s.endswith(’E’)) # False 4 print(s.islower ()) # True 5 print(s.isalnum ()) # True 6 print(s.isalpha ()) # True 7 print(s.isdigit ()) # False 19
  • 20. Recherche Méthode Description count Compte le nombre d’occurrence non chevauchées d’une sous-chaine find Trouve l’indice de la plus petite position d’une sous-chaine index Comme find, mais ValueError s’il ne trouve pas rfind Trouve l’indice de la plus grande position d’une sous-chaine rindex Comme rfind, mais ValueError s’il ne trouve pas replace Remplace les occurrences d’une sous-chaine par une autre 1 s = ’das große Haus ’ 2 print(s.count(’s’)) # 2 3 print(s.find(’s’)) # 2 4 print(s.rfind(’s’)) # 13 5 print(s.index(’A’)) # ValueError 6 print(s.replace(’ ’, ’;’)) # das;große;Haus 20
  • 21. Mise en page Méthode Description ljust Complète pour aligner à gauche dans une largeur spécifiée center Complète pour centrer dans une largeur spécifiée rjust Complète pour aligner à droite dans une largeur spécifiée 1 s = ’große ’ 2 print(s.ljust (10, ’.’)) 3 print(s.center (10, ’_’)) 4 print(s.rjust (10)) große ..... __große___ große 21
  • 22. Découpe Méthode Description lstrip Copie avec des caractères à gauche supprimés rstrip Copie avec des caractères à droite supprimés lstrip Copie avec des caractères à droite et à gauche supprimés split Découpe en fonction d’un séparateur splitlines Découpe en lignes partition Découpe en trois selon la première occurrence d’un séparateur rpartition Découpe en trois selon la dernière occurrence d’un séparateur 1 s = ’ grosßsseeeee ’ 2 print(s.rstrip(’es’)) # grosß 3 print(s.lstrip ()) # grosßsseeeee 4 print(s.partition(’s’)) # (’ gro ’, ’s’, ’ßsseeeee ’) 5 print(s.rpartition(’s’)) # (’ grosßs ’, ’s’, ’eeeee ’) 22
  • 23. Fusion Méthode Description join Fusionne des chaines de caractères avec un caractère spécifié 1 s = ’Je suis un gros lapin ’ 2 words = s.split(’ ’) 3 4 t = ’,’.join(words) 5 print(t) 6 print(’,’.join ([x.upper () for x in words ])) Je ,suis ,un ,gros ,lapin JE ,SUIS ,UN ,GROS ,LAPIN 23
  • 24. Conversion Donnée vers chaine de caractères avec str Définir la méthode __str__ pour les nouvelles classes Chaine de caractères vers une donnée par parsing Immédiatement ou via une fonction spécifique 1 i = 847 2 s = str(i) 3 print(s, type(s)) 4 5 r = ’1,9,2,3,-4,12’ 6 data = [int(x) for x in r.split(’,’)] 7 print(data , type(data)) 847 <class ’str ’> [1, 9, 2, 3, -4, 12] <class ’list ’> 24
  • 25. Concaténation Plus rapide de passer par join que concaténer Pour construire des chaines de caractères à incrémentalement La concaténation crée pleins de nouvelles chaines de caractères 1 def concat(n): 2 result = ’’ 3 i = 1 4 while i <= n: 5 result += str(i) + ’,’ 6 i += 1 7 return result [: -1] concat(1000000) ≈ 575 ms 1 def concat(n): 2 elems = [] 3 i = 1 4 while i <= n: 5 elems.append(str(i)) 6 i += 1 7 return ’,’.join(elems) concat(1000000) ≈ 454 ms 25
  • 26. Formatter Insertion d’une valeur à l’intérieur d’une chaine de caractères Définition d’un emplacement et spécification d’une valeur Utilisation de la méthode format sur une chaine Balises dans la chaine définies avec {} 1 s = "J’ai {age} ans.".format(age =30) 2 print(s) 3 4 d = ’{0}/{1}/{2} ’.format (22, 1, 2016) 5 print(d) J’ai 30 ans. 22/1/2016 26
  • 27. Appel des arguments Format Description {0} Premier paramètre positionnel {} Prend implicitement le paramètre positionnel suivant {name} Paramètre nommé name 0.attr Attribut attr du premier paramètre positionnel 0[0] Premier élément du premier paramètre positionnel 1 from collections import namedtuple 2 3 Point = namedtuple (’Point ’, [’x’, ’y’]) 4 p = Point (7, -2) 5 data = [1, 2, 3] 6 7 print(’{0.y} et {1[2]} ’.format(p, data)) -2 et 3 27
  • 28. Définition du format Format Description {:char <n } Texte aligné à gauche, sur largeur de n, rempli avec char {:char ^n } Texte centré, sur largeur de n, rempli avec char {:char >n } Texte aligné à droite, sur largeur de n, rempli avec char {:d} Conversion nombre entier {:s} Conversion chaine de caractères {:.precision f} Conversion nombre flottant avec précision après la virgule 1 value = 15.9842 2 print(’{0:f}n{0:.2f}n{0: >10.2f}n{0:* >10.2f}’.format(value)) 15.984200 15.98 15.98 *****15.98 28
  • 29. Template Construction d’un modèle dans lequel incruster des valeurs Ajout de balise dans une chaine et insertion avec substitute Le modèle ne doit être construit qu’une seule fois Et ensuite réutilisable avec plusieurs valeurs différentes 1 import string 2 3 s = string.Template(’Bonjour $prenom $nom ’) 4 5 print(s.substitute(prenom=’Quentin ’, nom=’Lurkin ’)) Bonjour Quentin Lurkin 29
  • 30. Encodage fichier source Par défaut, code source fichier Python en UTF-8 Depuis Python 3 uniquement, ASCII en Python 2 Possibilité de déclarer l’encodage du fichier Utilisation d’un commentaire spécial en début de fichier 1 # -*- coding: windows -1252 -*- 2 3 # blabla ... 30
  • 32. Validation de données Important de valider les inputs Données entrées par le user, provenant de fichiers, du réseau... Formatage des données Via un parser qui produit une erreur en cas de format invalide Vérifier les données avec une expression régulière (module re) La donnée suit-elle un motif prédéfini ? 32
  • 33. Exemple : Numéro de téléphone Numéro de téléphone de la forme xxxx/xx.xx.xx Où les x sont des chiffres [0-9]{4}/[0-9]{2}.[0-9]{2}.[0-9]{2} deux chiffres entre 0 et 9 quatre chiffres entre 0 et 9 un slash un point 1 pattern = r’[0 -9]{4}/[0 -9]{2}.[0 -9]{2}.[0 -9]{2} ’ 2 p = re.compile(pattern) 3 4 print(p.match(’0394/83.31.41 ’)) 5 print(p.match(’0394/83 -31 -41 ’)) <_sre.SRE_Match object; span =(0, 13) , match = ’0394/83.31.41 ’ > None 33
  • 34. Vérifier une chaine (1) Définition d’un motif représentant les chaines valides En utilisant une expression régulière Compilation du motif avec la fonction re.compile Renvoie un objet de type regex Vérification d’une chaine de caractères avec la méthode match Renvoie None si invalide, et un objet décrivant le match sinon 34
  • 35. Description de motif (1) Précéder les méta-caractères avec un backslash . ^ $ * + ? { } [ ] | ( ) Classes de caractères définies avec les [ ] [abc] : a, b ou c [0-9] : n’importe quoi entre 0 et 9 [a-zA-Z] : n’importe quoi entre a et z ou entre A et Z [^aeiou] : n’importe quoi sauf a, e, i, o ou u [a-z&&[^b]] : intersection entre deux ensembles Classes prédéfinies de caractères . : n’importe quel caractère (sauf retour à la ligne) d : un chiffre (équivalent à [0-9]) s : un caractère blanc (équivalent à [ tnrfv]) w : un caractère alpha-numérique (équivalent à [a-zA-Z0-9_]) 35
  • 36. Description de motif (2) Répétitions d’occurrences avec une quantificateur {n} : exactement n occurrences {m,n} : au moins m et au plus n occurrences {m,} : au moins m occurrences {,n} : au plus n occurrences Quantificateurs prédéfinis ? = {0,1} * = {0,} + = {1,} Frontières de recherche ^ : début de la ligne $ : fin de la ligne 36
  • 37. Exemple : Nombre entier Nombre entier avec éventuellement un signe − Le premier chiffre est non nul -?[1-9][0-9]* un chiffre entre 1 et 9 un signe (optionnel) zéro, un ou plusieurs chiffres entre 0 et 9 1 pattern = r’ -?[1 -9][0 -9]* ’ 2 p = re.compile(pattern) 3 4 print(p.match(’15’) is not None) # True 5 print(p.match(’03’) is not None) # False 6 print(p.match(’-7’) is not None) # True 7 print(p.match(’ -42’) is not None) # True 8 9 print(p.match(’8 enfants !’) is not None) # True 37
  • 38. Vérifier une chaine (2) Vérifier le contenu d’une chaine avec les frontières La méthode match cherche à partir du début de la chaine ^ matche le début de la chaine et $ la fin S’assure qu’une chaine complète suit un motif 1 pattern = r’ -?[1 -9][0 -9]* ’ 2 p = re.compile(pattern) 3 4 print(p.match(’8 enfants !’) is not None) # False 38
  • 39. Options de compilation Flags à passer à la méthode compile Constantes définies dans le module re, à combiner avec | Flag Description re.IGNORECASE Recherche insensible à la casse re.DOTALL Le point matche également les retours à la ligne re.MULTILINE Les matches peuvent se faire sur plusieurs lignes 1 pattern = r’^[a-z]+$’ 2 p = re.compile(pattern , re.IGNORECASE) 3 4 print(p.match(’bogoss ’) is not None) # True 5 print(p.match(’LaTeX ’) is not None) # True 39
  • 40. La peste du backslash Utilisation recommandée des chaines brutes Sinon, de nombreux soucis avec le backslash Nom de commande LATEX Regex Description [a-zA-Z]+ Nom d’une commande [a-zA-Z]+ Échappement du pour compile [a-zA-Z]+ Construction d’un littéral str 1 p = re.compile(’([a-zA -Z]+) ’) # re.compile(r ’([a-zA -Z]+) ’) 2 m = p.match(’ LaTeX ’) 3 if m is not None: 4 print(m.group (1)) 40
  • 41. Rechercher un motif (1) La méthode match renvoie un objet du match Plusieurs méthodes pour obtenir des informations sur le match Méthode Description group Renvoie la sous-chaine matchée start Renvoie la position du début du match end Renvoie la position de la fin du match span Renvoie un tuple avec les positions de début et de fin du match 1 pattern = r’d+’ 2 p = re.compile(pattern) 3 4 m = p.match(’72 est égal à 70 + 2’) 5 if m is not None: 6 print(m.group ()) # 72 41
  • 42. Rechercher un motif (2) search cherche un motif dans une chaine Recherche d’une sous-chaine qui matche le motif findall recherche toutes les sous-chaines qui matchent Renvoie une liste des sous-chaines matchées 1 pattern = r’d+’ 2 p = re.compile(pattern) 3 4 m = p.search(’on sait que 72 est égal à 70 + 2’) 5 if m is not None: 6 print(m.group ()) # 72 7 8 print(p.findall(’72 est égal à 70 + 2’)) # [’72’, ’70’, ’2’] 42
  • 43. Rechercher un motif (3) finditer renvoie un itérateur d’objets de match On peut ainsi parcourir les matchs avec une boucle for 1 pattern = r’d+’ 2 p = re.compile(pattern) 3 4 for m in p.finditer(’on sait que 72 est égal à 70 + 2’): 5 print(m.span (), ’:’, m.group ()) (12, 14) : 72 (26, 28) : 70 (31, 32) : 2 43
  • 44. Choix Alternative entre plusieurs motifs avec | Représente l’opérateur « ou » 1 pattern = r’^[0 -9]+|[a-z]+$’ 2 p = re.compile(pattern) 3 4 print(p.match(’283’) is not None) 5 print(p.match(’boat ’) is not None) 6 print(p.match(’boat283 ’) is not None) True True False 44
  • 45. Capturer des groupes Disséquer une chaine en sous-chaines matchantes Pouvoir extraire plusieurs parties d’une chaine donnée Définition de groupes dans le motif avec des ( ) Chaque groupe représente un sous-motif 1 pattern = r’^([a-z]+)@([a-z]+) .([a-z]{2 ,3})$’ 2 p = re.compile(pattern) 3 4 m = p.match(’email@example .net ’) 5 if m is not None: 6 print(m.groups ()) # (’email ’, ’example ’, ’net ’) 7 print(m.group (1)) # email 45
  • 46. Option de capture des groupes Option avec point d’interrogation après la parenthèse ouvrante Ce qui suit le ? décrit l’option Option spécifique à Python avec (?P...) Indique une option pas présente dans la syntaxe PERL Groupe non capturant avec l’option : Permet d’appliquer un quantificateur sur un sous-motif 1 pattern = r’^(?:[0 -9]+)$’ 2 p = re.compile(pattern) 3 4 m = p.match(’283 ’) 5 if m is not None: 6 print(m.groups ()) # () 46
  • 47. Groupe nommé Possibilité de nommer un groupe avec les options Python Le groupe est récupéré avec son nom plutôt que sa position 1 pattern = r’^(?P<pseudo >[a-z]+)@(?P<domain >[a-z]+) .(?P<extension >[ a-z]{2 ,3})$’ 2 p = re.compile(pattern) 3 4 m = p.match(’email@example .net ’) 5 if m is not None: 6 print(m.groups ()) 7 print(m.group (1)) 8 print(m.group(’domain ’)) (’email ’, ’example ’, ’net ’) email example 47
  • 48. Exemple : Extraction de liens (1) Extraction des adresses de liens dans une page HTML Retrouver la valeur de l’attribut href des éléments a Utilisation du motif <a.*href="(.*)".*> 1 pattern = r’<a.* href ="(.*) ".*>’ 2 p = re.compile(pattern , re.MULTILINE) 3 4 for m in p.finditer(’’’<a href =" http :// www.google.be" rel=" popup" class =" extlink"> 5 <a target =" _blank" href =" http :// www.yahoo.be" class =" extlink" rel =" popup"> 6 <a href =" http :// www.alltheweb.com">’’’): 7 print(m.group (1)) http :// www.google.be" rel=" popup" class =" extlink http :// www.yahoo.be" class =" extlink" rel =" popup http :// www.alltheweb.com 48
  • 49. Exemple : Extraction de liens (2) Solution 1 : Ne pas capturer " dans l’URL Utilisation du motif <a.*href="([^"]*)".*> Solution 2 : Utilisation des quantificateurs non greedy Capturent le moins possible (ajout d’un ? derrière) 1 pattern = r’<a.* href ="(.*?) ".*>’ 2 p = re.compile(pattern , re.MULTILINE) 3 4 # ... http :// www.google.be http :// www.yahoo.be http :// www.alltheweb.com 49
  • 50. Référence en arrière On peut faire référence à un groupe précédemment capturé suivi du numéro du groupe Permet par exemple la recherche de répétitions de mot Capture d’un mot suivi de blancs (s) et du même mot 1 p = re.compile(r’([a-z]+)s+1 ’) 2 m = p.search(’Il a une une pomme ’) 3 if m is not None: 4 print(m.group ()) une une 50
  • 51. Découpe de chaine La méthode split découpe une chaine selon un motif Permet d’avoir une expression régulière comme séparateur 1 pattern = r’[ ,;.?! -]+’ 2 p = re.compile(pattern) 3 4 words = p.split(’Bonjour ! Comment allez -vous ?’) 5 print(words) [’Bonjour ’, ’Comment ’, ’allez ’, ’vous ’, ’’] 51
  • 52. Liens RegexLib, http://www.regexlib.com/ Recueil d’expressions régulières Regex 101, https://regex101.com/ Testeur en ligne d’expressions régulières Regex Crossword, https://regexcrossword.com/ Jeu en ligne pour apprendre les expressions régulières 52