# kbis_persons_parser.py import re def extract_and_parse_persons(input_file: str = "kbis_extracted.txt") -> dict: """ 1. Extrait la section des personnes du K-bis. 2. Parse gérants et associés avec gestion des deux formats (compact + ligne par ligne). Retourne un dictionnaire avec les résultats. """ try: with open(input_file, "r", encoding="utf-8") as f: full_text = f.read() except FileNotFoundError: print("Erreur : fichier non trouvé.") return {"Gérant(s)": "Erreur", "Associé(s)": "Erreur"} # Étape 1 : Isolation de la section personnes pattern = r"(Gestion, Direction, Administration, Contrôle, Associés ou Membres)\s+(.*?)\s+(Renseignements sur l['’]établissement principal)" match = re.search(pattern, full_text, re.I | re.DOTALL) if not match: print("Section personnes non trouvée.") return {"Gérant(s)": "Non détecté", "Associé(s)": "Non détecté"} persons_text = match.group(2).strip() # Étape 2 : Parsing bi-modulaire gerants = [] associes = [] # Module 1 : Format compact (Qualité + rôle + Nom dans la même ligne) compact_pattern = re.finditer( r"Qualité\s+(gérant|Associé)\s+Nom[,;\s]*prénoms?\s*[:;,]?\s*([A-ZÀÂÄÇÉÈÊËÎÏÔÖÙÛÜŸ][A-Za-zàâäçéèêëîïôöùûüÿ\s,'’;-]+?)(?:\s+Date et lieu|\s+Nationalité|\s+Adresse|\s+Qualité|$)", persons_text, re.I ) for m in compact_pattern: role = m.group(1).lower() name = m.group(2).strip().rstrip(";,.") if "gérant" in role: gerants.append(name) else: associes.append(name) # Module 2 : Format ligne par ligne (en-tête répété + ligne "Associé NOM...") lines = [line.strip() for line in persons_text.split("\n") if line.strip()] i = 0 while i < len(lines): line = lines[i] if re.search(r"Qualité\s+Nom[;,]?\s*prénoms?\s+Date et lieu de naissance\s+Nationalité\s+Adresse", line, re.I): i += 1 if i < len(lines): next_line = lines[i] standalone_match = re.match( r"(gérant|Associé)\s*([A-ZÀÂÄÇÉÈÊËÎÏÔÖÙÛÜŸ][A-Za-zàâäçéèêëîïôöùûüÿ\s,'’;-]+)", next_line, re.I ) if standalone_match: role = standalone_match.group(1).lower() name = standalone_match.group(2).strip().rstrip(";,.") if "gérant" in role: gerants.append(name) else: associes.append(name) i += 1 # Déduplication tout en conservant l'ordre d'apparition gerants = list(dict.fromkeys(gerants)) associes = list(dict.fromkeys(associes)) result = { "Gérant(s)": ", ".join(gerants) if gerants else "Non détecté", "Associé(s)": ", ".join(associes) if associes else "Non détecté" } # Affichage propre print("=== RÉSULTAT FINAL ===") for key, value in result.items(): print(f"{key}: {value}") return result # === EXÉCUTION === if __name__ == "__main__": extract_and_parse_persons("kbis_extracted.txt")