v0.0.13: fix Markdown-bold splitting + \xa0 in PERSON_PATTERN
Deploy drhider / validate (push) Waiting to run

This commit is contained in:
2026-07-13 13:18:10 +04:00
parent 23b4ad9889
commit f3c854c5fb
3 changed files with 35 additions and 4 deletions
+2 -2
View File
@@ -41,8 +41,8 @@ COMPANY_PATTERN = re.compile(
# ФИО: Фамилия + инициалы (Иванов И.И.) или полное имя (Иванов Иван Иванович) # ФИО: Фамилия + инициалы (Иванов И.И.) или полное имя (Иванов Иван Иванович)
PERSON_PATTERN = re.compile( PERSON_PATTERN = re.compile(
r'\b[А-Я][а-я]+\s+[А-Я]\.[А-Я]\.' r'\b[А-Я][а-я]+[\s\xa0]+[А-Я]\.[А-Я]\.'
r'|\b[А-Я][а-я]+\s+[А-Я][а-я]+\s+[А-Я][а-я]+', r'|\b[А-Я][а-я]+[\s\xa0]+[А-Я][а-я]+[\s\xa0]+[А-Я][а-я]+',
) )
# ═══════════════════════════════════════════════════════════════════════════ # ═══════════════════════════════════════════════════════════════════════════
+32 -1
View File
@@ -12,6 +12,29 @@ import re
from typing import Dict, List 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: def apply_replacements(text: str, mapping: Dict[str, str], sorted_keys: List[str]) -> str:
"""Применить все замены из словаря mapping к строке. """Применить все замены из словаря mapping к строке.
@@ -41,7 +64,15 @@ def apply_replacements(text: str, mapping: Dict[str, str], sorted_keys: List[str
else: else:
pattern = re.escape(original) 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 return result
+1 -1
View File
@@ -20,7 +20,7 @@ if _sys_path_root not in sys.path:
sys.path.insert(0, _sys_path_root) sys.path.insert(0, _sys_path_root)
# Версия приложения (меняется при изменениях) # Версия приложения (меняется при изменениях)
VERSION = "0.0.12" VERSION = "0.0.13"
def create_app(): def create_app():