fix(regex): RE_HOPITAL_VILLE accepte les ALL-CAPS (CENTRE HOSPITALIER)

Le pattern type utilisait [Cc]entre\s+[Hh]ospitalier : seule la 1re lettre
de chaque mot était ambidextre, la suite devait être en minuscules. "CENTRE
HOSPITALIER COTE BASQUE" (tout majuscule) échappait → compensé par regex
YAML force_mask_regex "Centre\s+Hospitalier\s+…".

Fix : utiliser (?i:…) case-insensitive localement sur les sous-motifs "type
d'établissement" et "déterminants" (de, du, la…) tout en gardant le nom
propre strict (1re lettre majuscule obligatoire). Évite les FP tout en
capturant les majuscules complètes.

Cas validés :
- "Centre Hospitalier de Bayonne" → match (inchangé)
- "CENTRE HOSPITALIER COTE BASQUE" → match (nouveau)
- "POLYCLINIQUE CÔTE BASQUE SUD" → match (nouveau)
- "CLINIQUE SAINT-JEAN" → match (nouveau)
- "examen hôpital de Bordeaux" → pas de match (exclusion préservée)

Test YAML stripped : CENTRE HOSPITALIER et COTE BASQUE sont maintenant
masqués par ETAB (regex/AC) au lieu de force_term. Après ce fix + Fix #4,
on peut retirer les regex "Centre\s+Hospitalier…" et "Polyclinique…" du YAML.

Non-régression : 122 hits sur trackare-18007562 avec YAML complet.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-15 09:40:08 +02:00
parent 83769f6e63
commit aa3db69a9b

View File

@@ -1055,12 +1055,16 @@ RE_ETABLISSEMENT = re.compile(
)
RE_HOPITAL_VILLE = re.compile(
r"(?<![Ee]xamen )"
r"\b((?:[Hh]ôpital|[Cc]linique|[Pp]olyclinique|[Cc]entre\s+[Hh]ospitalier"
r"|[Cc]entre\s+[Mm][ée]dical|[Cc]entre\s+[Dd]e\s+[Ss]oins|[Mm]aison\s+[Dd]e\s+[Ss]anté"
r"|[Mm]aison\s+[Dd]e\s+[Rr]etraite|[Rr]ésidence|[Ff]oyer|[Pp]harmacie)"
r"\s+(?:de\s+|d['']\s*|du\s+|des\s+)?(?:la\s+|le\s+|l['']\s*|les\s+)?"
# Type d'établissement : case-insensitive sur le groupe (?i:...) pour capturer
# aussi bien "Centre Hospitalier" que "CENTRE HOSPITALIER" (documents ALL-CAPS).
r"\b((?i:hôpital|clinique|polyclinique|centre\s+hospitalier"
r"|centre\s+médical|centre\s+de\s+soins|maison\s+de\s+santé"
r"|maison\s+de\s+retraite|résidence|foyer|pharmacie)"
# Déterminants : case-insensitive aussi (de, DE, De… du, DU…).
r"\s+(?i:de\s+|d['']\s*|du\s+|des\s+)?(?i:la\s+|le\s+|l['']\s*|les\s+)?"
# Nom propre : toujours commence par une majuscule, queue accepte mélange.
r"(?:[A-ZÉÈÀÙÂÊÎÔÛÄËÏÖÜÇ][A-ZÉÈÀÙÂÊÎÔÛÄËÏÖÜÇa-zéèàùâêîôûäëïöüç\-']+)"
r"(?:\s+(?:de\s+|d['']\s*|du\s+|des\s+)?(?:la\s+|le\s+|l['']\s*|les\s+)?"
r"(?:\s+(?i:de\s+|d['']\s*|du\s+|des\s+)?(?i:la\s+|le\s+|l['']\s*|les\s+)?"
r"[A-ZÉÈÀÙÂÊÎÔÛÄËÏÖÜÇ][A-ZÉÈÀÙÂÊÎÔÛÄËÏÖÜÇa-zéèàùâêîôûäëïöüç\-']+)*)",
)
RE_SERVICE = re.compile(