v0.0.13: fix Markdown-bold splitting + \xa0 in PERSON_PATTERN
Deploy drhider / validate (push) Waiting to run
Deploy drhider / validate (push) Waiting to run
This commit is contained in:
+2
-2
@@ -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
@@ -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
@@ -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():
|
||||||
|
|||||||
Reference in New Issue
Block a user