"""Нормализация алиаса ЮЛ (§3 п. 4, ANL-028): ключ сопоставления контрагента из ОСВ с ЮЛ по тексту названия. Чистая функция без обращения к БД; одно и то же название в разных написаниях (`ООО «Пекарня»`, `Пекарня, ООО`) даёт один и тот же `normalized_alias`. """ import re # Одиночные токены ОПФ (§3 п. 4: «ООО, АО, ПАО, ИП…»); убираются только целиком — «ооо» внутри слова не трогается. LEGAL_FORMS: frozenset[str] = frozenset( { "ооо", "ао", "пао", "зао", "оао", "нао", "ип", "гуп", "муп", "фгуп", "ано", "тсж", "кфх", "пк", "спк", "сх", "сха", } ) _PUNCT_RE = re.compile(r"[^\w\s]", re.UNICODE) # кавычки «»"'„“ и прочая пунктуация → пробел def normalize_alias(raw: str) -> str: """§3: lower → ё→е → пунктуация и кавычки → пробел → убрать токены ОПФ → схлопнуть пробелы → strip. Строка из одних ОПФ и пунктуации нормализуется в `""` — вызывающий отвергает такой алиас. """ text = _PUNCT_RE.sub(" ", raw.lower().replace("ё", "е")) return " ".join(token for token in text.split() if token not in LEGAL_FORMS)