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'
[ ]:


Notebook on github