diff --git a/drhider/config.py b/drhider/config.py index 80451f7..90d097b 100644 --- a/drhider/config.py +++ b/drhider/config.py @@ -41,8 +41,8 @@ COMPANY_PATTERN = re.compile( # ФИО: Фамилия + инициалы (Иванов И.И.) или полное имя (Иванов Иван Иванович) PERSON_PATTERN = re.compile( - r'\b[А-Я][а-я]+\s+[А-Я]\.[А-Я]\.' - r'|\b[А-Я][а-я]+\s+[А-Я][а-я]+\s+[А-Я][а-я]+', + r'\b[А-Я][а-я]+[\s\xa0]+[А-Я]\.[А-Я]\.' + r'|\b[А-Я][а-я]+[\s\xa0]+[А-Я][а-я]+[\s\xa0]+[А-Я][а-я]+', ) # ═══════════════════════════════════════════════════════════════════════════ diff --git a/drhider/replacer.py b/drhider/replacer.py index 2b5dbc3..cdb40cc 100644 --- a/drhider/replacer.py +++ b/drhider/replacer.py @@ -12,6 +12,29 @@ import re from typing import Dict, List +def _md_tolerant_pattern(original: str) -> str: + r"""Паттерн, допускающий ** между частями строки (Markdown bold). + + DOCX → Markdown: жирность добавляет ** вокруг слов. + Если ** попадает внутрь сущности (например, **ООО **"**НУБЕС**"), + точное совпадение не срабатывает. + + Этот паттерн вставляет (?:\*{1,2})? между каждым словом/символом, + позволяя найти сущность даже с ** внутри. + + Args: + original: Исходная строка сущности (например, 'ООО "НУБЕС"') + + Returns: + Regex-паттерн, находящий ту же строку с ** между частями + """ + MD = r'(?:\*{1,2})?' + parts = re.findall(r'[А-ЯЁа-яёA-Za-z0-9]+|[^А-ЯЁа-яёA-Za-z0-9]', original) + if len(parts) <= 1: + return None # Одно слово — ** не может разорвать изнутри + return MD + MD.join(re.escape(p) for p in parts) + MD + + def apply_replacements(text: str, mapping: Dict[str, str], sorted_keys: List[str]) -> str: """Применить все замены из словаря mapping к строке. @@ -41,7 +64,15 @@ def apply_replacements(text: str, mapping: Dict[str, str], sorted_keys: List[str else: pattern = re.escape(original) - result = re.sub(pattern, replacement, result) + new_result = re.sub(pattern, replacement, result) + + # Фоллбэк: Markdown-жирность могла разорвать строку (**ООО **"**НУБЕС**") + if new_result == result: + md_pattern = _md_tolerant_pattern(original) + if md_pattern is not None: + new_result = re.sub(md_pattern, replacement, result) + + result = new_result return result diff --git a/site/app.py b/site/app.py index e90faaa..d4f4e26 100644 --- a/site/app.py +++ b/site/app.py @@ -20,7 +20,7 @@ if _sys_path_root not in sys.path: sys.path.insert(0, _sys_path_root) # Версия приложения (меняется при изменениях) -VERSION = "0.0.12" +VERSION = "0.0.13" def create_app():