Séance 6 - epressions régulières¶
[15]:
texte = """
Voici un texte intégrant 50 formules de politesse variées, adaptées à différents contextes (professionnel, amical, formel, informel, écrit, oral) :
---
**Objet : Remerciements et suite à notre échange**
Chère Madame Dupont,
Je me permets de vous adresser ce message afin de vous exprimer toute ma gratitude pour l’attention que vous avez portée à mon projet. **1. Je vous remercie sincèrement** pour le temps que vous m’avez accordé lors de notre dernière rencontre.
**2. Veuillez agréer, Madame, l’expression de mes salutations distinguées.**
Je tiens à souligner la qualité de vos conseils, qui m’ont été d’une aide précieuse. **3. Je vous en suis profondément reconnaissant(e).**
**4. Avec toute ma considération,**
Je vous prie de bien vouloir trouver ci-joint le document que vous m’avez demandé. **5. N’hésitez pas à me faire savoir** si vous souhaitez que j’apporte des modifications ou des précisions.
**6. Dans l’attente de votre retour, je reste à votre disposition** pour toute information complémentaire.
**7. Je vous remercie par avance** pour l’attention que vous porterez à ce dossier.
**8. Cordialement,**
Je souhaiterais également vous informer que l’événement aura lieu le 15 novembre prochain. **9. Seriez-vous disponible** pour y assister ?
**10. Je serais ravi(e) de vous y retrouver.**
**11. En espérant avoir le plaisir de vous compter parmi nous,**
Je vous prie d’agréer, Cher Monsieur, **12. l’assurance de ma parfaite considération.**
**13. Bien à vous,**
Pour revenir sur notre échange téléphonique, **14. je vous confirme** que les délais seront respectés.
**15. Merci de votre confiance.**
**16. Avec mes sincères salutations,**
Je vous invite à consulter le rapport joint pour plus de détails. **17. Je reste à l’écoute** de vos remarques.
**18. En vous remerciant de votre bienveillance,**
Je vous souhaite une excellente journée. **19. Prenez soin de vous.**
**20. Amicalement,**
Je tenais à vous faire part de ma satisfaction quant à notre collaboration. **21. C’est un réel plaisir de travailler à vos côtés.**
**22. Avec toute mon amitié,**
Je vous propose de nous retrouver la semaine prochaine pour en discuter plus en détail. **23. Qu’en pensez-vous ?**
**24. À très bientôt,**
Je vous joins les informations demandées et **25. vous prie de m’excuser** pour le léger retard.
**26. Avec mes excuses les plus sincères,**
Je vous remercie pour votre compréhension. **27. Je vous en suis infiniment reconnaissant(e).**
**28. Respectueusement,**
Je vous informe que le projet avance selon le planning prévu. **29. Je vous tiendrai informé(e) des prochaines étapes.**
**30. Dans l’attente de votre réponse,**
Je vous souhaite un excellent week-end. **31. Profitez bien de ces moments de détente.**
**32. Avec toute ma sympathie,**
Je vous serais gré de bien vouloir me confirmer votre présence. **33. Merci d’avance pour votre retour.**
**34. Bien cordialement,**
Je vous adresse mes plus vifs remerciements pour votre soutien. **35. Votre aide m’est précieuse.**
**36. Avec toute ma gratitude,**
Je vous prie de croire, Madame, **37. en l’expression de mes sentiments les plus respectueux.**
**38. Très respectueusement,**
Je vous informe que le dossier est désormais complet. **39. Je reste à votre entière disposition** pour toute question.
**40. Avec mes meilleures pensées,**
Je vous souhaite une belle journée. **41. À très vite, j’espère.**
**42. Avec toute mon affection,**
Je vous remercie pour votre patience. **43. Votre bienveillance me touche beaucoup.**
**44. Avec toute ma reconnaissance,**
Je vous prie de bien vouloir excuser ce contretemps. **45. Je ferai tout mon possible pour y remédier.**
**46. Avec mes excuses renouvelées,**
Je vous remercie pour votre confiance renouvelée. **47. C’est un honneur de collaborer avec vous.**
**48. Avec toute mon estime,**
Je vous souhaite une excellente continuation. **49. Au plaisir de vous revoir bientôt.**
**50. Bien à vous,**
**51. Merci, je vous dois beaucoup.**
Merci pour ces formules de politesse.
---
N’hésitez pas à me dire si vous souhaitez adapter ce texte à un contexte particulier !
"""
[16]:
morceaux = texte.split("**")
morceaux[-5:]
[16]:
['\n\n',
'50. Bien à vous,',
'\n\n',
'51. Merci, je vous dois beaucoup.',
'\n\nMerci pour ces formules de politesse.\n\n---\n\nN’hésitez pas à me dire si vous souhaitez adapter ce texte à un contexte particulier !\n']
[17]:
for m in morceaux:
if "merci" in m.lower():
mot = m.lower().split(" ")
if "merci" in mot:
print(m)
15. Merci de votre confiance.
33. Merci d’avance pour votre retour.
[18]:
for m in morceaux:
if "merci" not in m.lower():
continue
f = m.lower().replace(",", " ").replace(".", " ").replace("\n", " ")
mot = f.lower().split(" ")
if "merci" not in mot:
continue
print(m)
15. Merci de votre confiance.
33. Merci d’avance pour votre retour.
51. Merci, je vous dois beaucoup.
Merci pour ces formules de politesse.
---
N’hésitez pas à me dire si vous souhaitez adapter ce texte à un contexte particulier !
[19]:
import re
tous_les_merci = re.findall(r"\*\*(merci)\*\*", texte)
tous_les_merci
[19]:
[]
[20]:
motif = r"\*\*(.*?merci.*?)\*\*"
resultats = re.findall(motif, "**merci 1**, **merci 2**", flags=re.IGNORECASE)
print(resultats)
['merci 1', 'merci 2']
[21]:
resultats = re.findall(motif, texte, flags=re.IGNORECASE)
print(resultats)
['Objet : Remerciements et suite à notre échange', '1. Je vous remercie sincèrement', '7. Je vous remercie par avance', '15. Merci de votre confiance.', '18. En vous remerciant de votre bienveillance,', '33. Merci d’avance pour votre retour.', '51. Merci, je vous dois beaucoup.']
[22]:
motif = r"\*\*(?=[^*]*merci\b)[^*]*\*\*"
resultats = re.findall(motif, texte, flags=re.IGNORECASE)
print(resultats)
['**15. Merci de votre confiance.**', '**33. Merci d’avance pour votre retour.**', '**51. Merci, je vous dois beaucoup.**']
[23]:
import os
import zipfile
# Dossier contenant les fichiers ZIP
dossier_zip = "chemin/vers/vos/fichiers_zip" # Remplacez par votre chemin
# Dossier de destination pour les fichiers décompressés
dossier_dest = "chemin/vers/dossier_destination" # Remplacez par votre chemin
# Liste tous les fichiers ZIP dans le dossier
if os.path.exists(dossier_zip):
fichiers_zip = [f for f in os.listdir(dossier_zip) if f.endswith(".zip")]
else:
fichiers_zip = []
if fichiers_zip:
# Crée le dossier de destination s'il n'existe pas
os.makedirs(dossier_dest, exist_ok=True)
print(f"Trouvé {len(fichiers_zip)} fichiers ZIP à décompresser.")
for fichier in fichiers_zip:
chemin_zip = os.path.join(dossier_zip, fichier)
nom_dossier = os.path.splitext(fichier)[0] # Nom du sous-dossier = nom du ZIP
dossier_sortie = os.path.join(dossier_dest, nom_dossier)
try:
with zipfile.ZipFile(chemin_zip, "r") as zip_ref:
zip_ref.extractall(dossier_sortie)
print(f"✅ Décompression réussie : {fichier} -> {nom_dossier}")
except zipfile.BadZipFile:
print(f"❌ Erreur : {fichier} est corrompu ou n'est pas un ZIP valide.")
except Exception as e:
print(f"❌ Erreur inattendue avec {fichier} : {e}")
print("Décompression terminée !")
[24]:
import os
import pandas as pd
# Dossier contenant vos fichiers Excel
dossier_excel = "chemin/vers/vos/fichiers_excel" # Remplacez par votre chemin
if os.path.exists(dossier_excel):
# Nom du fichier Excel de sortie
fichier_sortie = "fichier_fusionne.xlsx" # Remplacez par le nom souhaité
# Liste tous les fichiers Excel dans le dossier
fichiers_excel = [
f for f in os.listdir(dossier_excel) if f.endswith((".xlsx", ".xls"))
]
print(f"Trouvé {len(fichiers_excel)} fichiers Excel à fusionner.")
# Crée un objet ExcelWriter pour écrire le fichier de sortie
with pd.ExcelWriter(fichier_sortie, engine="openpyxl") as writer:
for fichier in fichiers_excel:
chemin_fichier = os.path.join(dossier_excel, fichier)
# Lit chaque fichier Excel
df = pd.read_excel(chemin_fichier)
# Nom de l'onglet = nom du fichier (sans extension)
nom_onglet = os.path.splitext(fichier)[0][
:31
] # Excel limite à 31 caractères
# Écrit dans le fichier de sortie, dans un nouvel onglet
df.to_excel(writer, sheet_name=nom_onglet, index=False)
print(f"✅ Ajouté : {fichier} -> onglet '{nom_onglet}'")
print(
f"Fusion terminée ! Le fichier '{fichier_sortie}' contient {len(fichiers_excel)} onglets."
)
[25]:
import os
import cv2
# Chemin du répertoire contenant vos images
dossier_images = "chemin/vers/vos/images" # Remplacez par votre chemin
if os.path.exists(dossier_images):
# Chemin du répertoire de sortie (pour les images avec visages)
dossier_sortie = "chemin/vers/images_avec_visages" # Remplacez par votre chemin
# Crée le dossier de sortie s'il n'existe pas
os.makedirs(dossier_sortie, exist_ok=True)
# Charge le classificateur de visages pré-entraîné d'OpenCV
face_cascade = cv2.CascadeClassifier(
cv2.data.haarcascades + "haarcascade_frontalface_default.xml"
)
# Liste des extensions d'image supportées
extensions = (".jpg", ".jpeg", ".png", ".bmp", ".gif")
# Parcourt toutes les images du répertoire
for fichier in os.listdir(dossier_images):
if fichier.lower().endswith(extensions):
chemin_image = os.path.join(dossier_images, fichier)
# Lit l'image
img = cv2.imread(chemin_image)
if img is None:
continue # Ignore si l'image ne peut pas être lue
# Convertit en niveaux de gris pour la détection
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Détecte les visages
faces = face_cascade.detectMultiScale(
gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30)
)
# Si au moins un visage est détecté, copie l'image dans le dossier de sortie
if len(faces) > 0:
chemin_sortie = os.path.join(dossier_sortie, fichier)
cv2.imwrite(chemin_sortie, img)
print(f"✅ Visage détecté : {fichier}")
print("Filtrage terminé ! Les images avec visages sont dans :", dossier_sortie)
[26]:
import os
from PIL import Image
import matplotlib.pyplot as plt
import math
# Chemin du répertoire contenant vos images
dossier_images = "Telechargements" # Remplacez par votre chemin
if os.path.exists(dossier_images):
# Chemin de sortie pour le poster
poster_sortie = "poster_miniatures.jpg" # Remplacez par le nom souhaité
# Taille des miniatures (en pixels)
taille_miniature = (200, 200)
# Marge entre les miniatures (en pixels)
marge = 20
# Fond du poster (blanc par défaut)
fond = (255, 255, 255)
# Liste des extensions d'image supportées
extensions = (".jpg", ".jpeg", ".png", ".bmp", ".gif")
# Récupère la liste des images
images = [f for f in os.listdir(dossier_images) if f.lower().endswith(extensions)]
images.sort() # Trie par nom
print("nombre d'images", len(images))
# 1/ Zoom
zoom = []
for i, image in enumerate(images):
chemin_image = os.path.join(dossier_images, image)
img = Image.open(chemin_image)
w, h = img.size
minhw = min(w, h)
ratio = 200 / minhw
img = img.resize((int(w * ratio), int(h * ratio)))
zoom.append(img)
print(f"image {i}: {img.size}")
# 2. position
print("-----")
positions = []
x, y = 0, 0
miny = 1000
maxy = 0
for i, img in enumerate(zoom):
positions.append((x, y))
w, h = img.size
x += w
miny = min(h, miny)
maxy = max(maxy, y + miny)
if x >= 1200:
x = 0
y += miny
miny = 1000
print(i, (x, y), miny)
print(positions)
largeur_poster = 1200
hauteur_poster = maxy
# Crée une image vide pour le poster
poster = Image.new("RGB", (largeur_poster, hauteur_poster), fond)
for pos, img in zip(positions, zoom):
poster.paste(img, pos)
x = pos[0] + img.size[0]
y = pos[1]
i = 0
while x < 1200:
poster.paste(zoom[i], (x, y))
x += zoom[i].size[0]
# Sauvegarde le poster
poster.save(poster_sortie)
print(f"✅ Poster généré : {poster_sortie} ({nb_images} miniatures)")
plt.figure(figsize=(20, 10)) # Ajustez la taille selon vos besoins
plt.imshow(poster)
plt.axis("off") # Masque les axes
plt.title(f"Poster de miniatures ({nb_images} images)")
plt.show()
[27]:
def plus_grande_sequence_commune_naif(seq1, seq2):
for length in range(len(seq1), 0, -1):
for i in range(len(seq1)):
if i + length <= len(seq1):
s1 = seq1[i : i + length]
if s1 in seq2:
return s1
return ""
seq1 = "ABCDEFGHIZERT"
seq2 = "ABGGHIZTJKL"
plus_grande_sequence_commune_naif(seq1, seq2)
[27]:
'GHIZ'
[28]:
import numpy as np
import pprint
def distance_edition(m1, m2):
cout = np.empty((len(m1) + 1, len(m2) + 1))
predi = np.empty((len(m1) + 1, len(m2) + 1), dtype=np.int64)
predj = np.empty((len(m1) + 1, len(m2) + 1), dtype=np.int64)
cout[:, 0] = np.arange(len(m1) + 1)
cout[0, :] = np.arange(len(m2) + 1)
predi[:, 0] = np.arange(len(m1) + 1) - 1
predj[:, 0] = 0
predi[0, :] = 0
predj[0, :] = np.arange(len(m2) + 1) - 1
for i in range(1, len(m1) + 1):
for j in range(1, len(m2) + 1):
c_sup = cout[i - 1, j] + 1
c_ins = cout[i, j - 1] + 1
c_cmp = cout[i - 1, j - 1] + (1 if m1[i - 1] != m2[j - 1] else 0)
if c_cmp <= min(c_sup, c_ins):
cout[i, j], predi[i, j], predj[i, j] = c_cmp, i - 1, j - 1
elif c_sup <= c_ins:
cout[i, j], predi[i, j], predj[i, j] = c_sup, i - 1, j
else:
cout[i, j], predi[i, j], predj[i, j] = c_ins, i, j - 1
# alignement
alignement = [(len(m1), len(m2))]
while min(alignement[-1]) >= 0:
i, j = alignement[-1]
i, j = predi[i, j], predj[i, j]
alignement.append((i, j))
alignement = alignement[::-1][2:]
lettres = [(m1[i - 1], m2[j - 1]) for i, j in alignement]
return cout, alignement, lettres
def plus_grande_sequence_commune(seq1, seq2):
cout, alignement, lettres = distance_edition(seq1, seq2)
i0 = None
best = None
for i, (c1, c2) in enumerate(lettres):
if c1 == c2:
if i0 is None:
i0 = i
if i0 is not None and best is None or i - i0 + 1 > len(best):
best = "".join(c[1] for c in lettres[i0 : i + 1])
else:
i0 = None
return best
# cout, alignement, lettres = distance_edition(seq1, seq2)
# pprint.pprint(list(zip(alignement,lettres)))
plus_grande_sequence_commune(seq1, seq2)
[28]:
'GHIZ'
[ ]: