Programmation PYTHON
Cours 6
Nassim ZELLAL
2019/2020
Expressions régulières - 2
La mémorisation de modèle - référence arrière
Les parenthèses () : mémorisation (référence arrière).
ligne="eleve3 au poste3"
if re.search("(\d).+poste\\1",ligne):
#on peut ajouter le préfixe « r » et écrire (r"(\d).+poste\1",ligne):
print("ok")
#----------------------------------------------------------#
ligne="eleve3 au poste5"
if re.search("(\d).+poste\\1",ligne):
#on peut ajouter le préfixe « r » et écrire (r"(\d).+poste\1",ligne):
print("ok")
La mémorisation de modèle - group()
Les parenthèses () s’utilisent avec la méthode
group() pour extraire la sous-chaîne de
caractères placée entre ces parenthèses.
import re
ligne="eleve3 au poste5"
x=re.search("(.+)(\d)(.+)(po(.+))(\d)",ligne)
print(x.group(6)+" "+x.group(5)+" "+x.group(4)+"
"+x.group(3)+" "+x.group(2)+" "+x.group(1))
La mémorisation de modèle - group()
La mémorisation de modèle - groups()
La méthode groups() retourne un tuple
contenant tous les sous-groupes reconnus par
l’expression régulière.
import re
m = re.match("(\d+)\.(\d+)", "24.1632")
#il n’est pas nécessaire de déspécialiser le point (\.)
dans cet exemple
print(m.groups())
La mémorisation de modèle - groups()
Expressions régulières - regroupement
import re,sys
var=open(sys.argv[1],'r')
res=var.readlines()
for i in range(len(res)):
if re.search(r"\b(homme|femme)\b",res[i]):
print(res[i],end="")
var.close()
Expressions régulières - flags (arguments optionnels)
re.I : recherche insensible à la casse.
re.S : traiter la chaîne comme une ligne simple.
(avec l’argument optionnel re.S, le caractère .
reconnaît aussi les sauts de ligne).
Expressions régulières - flags (arguments optionnels)
import sys,re
Extraction des sauts de ligne
var=open(sys.argv[1],'r') précédés d’un point
var2=open("res.txt",'w') d’exclamation.
a=1
for i in var.readlines():
x=re.search("!(.$)",i,re.S)
if x!=None :#éviter les objets de type "None" (NoneType
object) /ou bien if x:
var2.write("Ligne "+str(a)+" résultat : "+x.group(1))
a+=1 Un objet "None" est incompatible
avec la méthode group().
Expressions régulières - flags (arguments optionnels)
Expressions régulières - flags (arguments optionnels)
import sys,re
var=open(sys.argv[1],'r')
var2=open("res.txt",'w')
for i in var.readlines():
x=re.search("(chocolat)",i,re.I)
if x:#éviter les objets de type "None"
var2.write("Résultat : "+x.group(1)+"\n")
Expressions régulières - flags (arguments optionnels)
Expressions régulières - flags (arguments optionnels)
import sys,re
var=open(sys.argv[1],'r')
var2=open("res.txt",'w')
for i in var.readlines():
x=re.findall("chocolat",i,re.I)
for c in x:
var2.write("Résultat : "+c+"\n")
Expressions régulières - flags (arguments optionnels)
Expressions régulières - substitution
import sys,re
var=open(sys.argv[1],'r')
var2=open("res.txt",'w')
for i in var.readlines():
x=re.sub("chocolat","pain",i,flags=re.I)
var2.write(x)
#Avec sub() on doit écrire « flags » avant un flag.
Expressions régulières - substitution
Expressions régulières - look-around
(?=expression) regarde-devant positif (look ahead)
(?!expression) regarde-devant négatif (look ahead)
(?<=expression) regarde-derrière positif (look
behind)
(?<!expression) regarde-derrière négatif (look
behind)
Expressions régulières - look-around
import re
x = "J'ai mangé le croissantqui était sur la table"
y = "I catch the red fly"
Il y a une tabulation ici.
z = "Je m'appelle Tom-cat "
xx=re.search("(croissant)(?!\s)",x)
print(xx.group(1)) # reconnaît croissant
yy=re.search("(?<=\t)(.+)",y)
print(yy.group(1)) #reconnaît 'fly'
zz=re.search("(?<=-)(cat)(?=\s)",z)
print(zz.group(1))# reconnaît 'cat' dans 'Tom-cat'
Exercice 1
Modifier le script ci-dessous (slide 12), afin qu'il
puisse extraire tous les sauts de ligne du fichier
« flags.txt ».
import sys,re
var=open(sys.argv[1],'r')
var2=open("res.txt",'w')
a=1
for i in var.readlines():
x=re.search("!(.$)",i,re.S)
if x:
var2.write("Ligne "+str(a)+" résultat :
"+x.group(1))
a+=1
Exercice 2
Modifier le script ci-dessous (slide 16), afin qu'il
puisse extraire toutes les occurrences de
« chocolat » du fichier « flags.txt » sans utiliser les
2 boucles for.
import sys,re
var=open(sys.argv[1],'r')
var2=open("res.txt",'w')
res=var.readlines()
for i in res:
x=re.findall("chocolat",i,re.I)
for c in x:
var2.write("Résultat : "+c+"\n")
Exercice 3
1/ Faire un script qui prend en entrée "text-b.txt"
encodé en UTF-8 du cours 6;
2/ Trier les tokens par ordre alphabétique
décroissant et afficher ce tri dans un fichier;
3/ Afficher dans un autre fichier :
3.1/ le nombre de tokens;
3.2/ les phrases exclamatives;
3.3/ les phrases interrogatives;
3.4/ afficher toutes les occurrences du token
« homme » qui sont suivies d’un verbe ;