#! /usr/bin/python3 # Recherche et remplace selon une expression régulière # Jean-Christophe Beumier - 2024.12.08 - autodocumenté ! # GPL 3.0 : https://www.gnu.org/licenses/gpl-3.0.en.html # écrit pour UNIX! À adapter pour Windows ou MacIntosh import sys, os, re, time chemin =os.path.dirname(sys.argv[0]) # chemin + fichier du script chemin =os.path.abspath(chemin) # répertoire actuel print(f" Le chemin actuel est {chemin}\n") fichier =input(" Fichier à traiter : ") rech =input(""" === Recherche et remplacement de chaînes selon une expression régulière ===\n . désigne n'importe quel caractère sauf un retour-chariot \w désigne un chiffre ou une lettre (latine ou non, diacritiques acceptés) \W désigne un caractère qui ne soit ni lettre ni chiffre \s désigne un caractère 'espace' (tab, retour, nouvelle ligne...) \S désigne un caractère non espace tels que défini ci-dessus \d désigne un chiffre; équivaut à [0-9] \D désigne un caractère sauf les chiffres [A-Z^M] choisit un caractère (majuscule) de A à Z, sauf M [a-flk^d] choisit un caractère parmi a, b, c, e, f, l ou k () permet de traiter un groupe de caractères ou un choix : | permet un choix entre chaînes: (a|p)m représente am ou pm () permet également de préserver des chaînes dans le motif de remplacement, elle sont appelées avec \\1 \\2... ? suit un caractère ou (groupe) optionnel: roc(he)? = roc ou roche ? permet également un mode non gourmand pour les quatre suivants + suit un caractère ou (groupe) présent au moins une fois * suit un caractère ou (groupe) répété un nombre indéfini de fois {n} suit un caractère ou (groupe) répété exactement n fois {n,m} suit un caractère ou (groupe) répété de n à m fois ^ désigne le début: ^pot pour les chaînes commençant par pot $ désigne la fin: able$ pour les chaînes terminant par able \ préserve un caractère servant normalement au codage: \()[]{}.$^|?+* Ex: "([a-z]*?)\.(.{3})!? sélectionne les chaines comportant - un certain nombre de caractères non accentués (à récupérer avec '\\1') - suivis d'un point - suivi de trois caractères quelconques (à récupérer avec '\\2') - suivis d'un éventuel point d'exclamation Motif à rechercher : """) rempl =input("Motif de remplacement, \\1, \\2... pour les (morceaux) à replacer : ") # ouvre le fichier à traiter, dans la variable 'texte' with open(fichier) as df : texte =df.read() # remplacement selon l'expression régulière texte =re.sub(rech, rempl, texte) # détermination de la date et de l'heure dh =time.strftime("%y%m%d-%H%M%S") # sauvegarde de l'ancien fichier sous nom-date-heure os.rename(fichier, f"{fichier}-{dh}") #sauvegarde du fichier modifié, au nom inchangé with open(fichier, "w") as df : df.write(texte)