docs: ответ Sonnet — фикс Markdown-жирности и \xa0 в PERSON_PATTERN
Deploy drhider / validate (push) Waiting to run
Deploy drhider / validate (push) Waiting to run
This commit is contained in:
@@ -0,0 +1,37 @@
|
|||||||
|
# Sonnet: анализ багов обфускации — fix
|
||||||
|
|
||||||
|
**Дата:** 2026-07-13
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Баг 1: `ООО "НУБЕС"` не заменено
|
||||||
|
|
||||||
|
**Причина:** DOCX → Markdown: `**ООО **"**НУБЕС**"`. Кавычка в отдельном run → `**` разрывает строку. Replacer ищет точное совпадение `ООО "НУБЕС"` — не находит.
|
||||||
|
|
||||||
|
**Фикс (replacer.py):** добавить `_md_tolerant_pattern()` — паттерн, допускающий `**` между частями строки. При промахе точного совпадения — фоллбэк с этим паттерном.
|
||||||
|
|
||||||
|
```python
|
||||||
|
def _md_tolerant_pattern(original: str) -> str:
|
||||||
|
MD = r'(?:\*{1,2})?'
|
||||||
|
parts = re.findall(r'[А-ЯЁа-яёA-Za-z0-9]+|[^А-ЯЁа-яёA-Za-z0-9]', original)
|
||||||
|
return MD + MD.join(re.escape(p) for p in parts) + MD
|
||||||
|
```
|
||||||
|
|
||||||
|
## Баг 2: `Новиков И.В.` → `ФИО`
|
||||||
|
|
||||||
|
**Причина:** В оригинале буквально `ФИО` — незаполненный шаблон. Не баг паттерна.
|
||||||
|
|
||||||
|
**Превентивный фикс (config.py):** `\s+` → `[\s\xa0]+` в PERSON_PATTERN — на случай неразрывных пробелов в DOCX.
|
||||||
|
|
||||||
|
```python
|
||||||
|
PERSON_PATTERN = re.compile(
|
||||||
|
r'\b[А-Я][а-я]+[\s\xa0]+[А-Я]\.[А-Я]\.'
|
||||||
|
r'|\b[А-Я][а-я]+[\s\xa0]+[А-Я][а-я]+[\s\xa0]+[А-Я][а-я]+',
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Моё мнение
|
||||||
|
|
||||||
|
**Баг 1 — делать.** Логично, минимально, решает проблему Markdown-жирности.
|
||||||
|
|
||||||
|
**Баг 2 — `\xa0` делать** (превентивно). Сам `ФИО` — не баг, документ содержит незаполненный шаблон. Можно добавить `ФИО` в список игнорируемых (исключить из mapping), но не обязательно.
|
||||||
Reference in New Issue
Block a user