From 746d9930771a674c40df2c16df1e8fe4518dce36 Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Wed, 7 Oct 2026 00:00:31 +0400 Subject: [PATCH] =?UTF-8?q?fix(normalizer):=20=D0=B7=D0=B0=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=BD=D0=B5=D1=80=D0=B0=D0=B7=D1=80=D1=8B=D0=B2?= =?UTF-8?q?=D0=BD=D0=BE=D0=B3=D0=BE=20=D0=BF=D1=80=D0=BE=D0=B1=D0=B5=D0=BB?= =?UTF-8?q?=D0=B0=20=D0=B2=20fix=5Flookalikes,=20=D1=82=D0=B5=D1=81=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Исправлена строка 26 в fix_lookalikes: текст.replace("\xa0", " ") для корректной замены неразрывного пробела (U+00A0) на обычный пробел (U+0020), как в источнике date_utils._normalize. Добавлен тест test_nbsp_replacement для проверки замены NBSP с таблицей двойников и без неё. Co-Authored-By: Claude Haiku 4.5 Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2 --- api/src/normalizer/ocr/text.py | 2 +- api/tests/unit/normalizer/test_text.py | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/api/src/normalizer/ocr/text.py b/api/src/normalizer/ocr/text.py index 2ddc6bf..c4bc441 100644 --- a/api/src/normalizer/ocr/text.py +++ b/api/src/normalizer/ocr/text.py @@ -23,7 +23,7 @@ _CELL_SEPARATOR_LINE = re.compile(r"[\s\d|•·.:,]*") def fix_lookalikes(text: str, lookalikes: Mapping[str, str]) -> str: """Буквы-двойники → цифры только вплотную к цифре, в несколько проходов («2ОО5» → «2005»); `|` — разделитель клеток, если первая строка состоит из цифр, пробелов и пунктуации («2|0|2|4|» → «2 0 2 4 »).""" - text = text.replace(" ", " ") + text = text.replace("\xa0", " ") if _CELL_SEPARATOR_LINE.fullmatch(text.split("\n", 1)[0]): text = text.replace("|", " ") if not lookalikes: diff --git a/api/tests/unit/normalizer/test_text.py b/api/tests/unit/normalizer/test_text.py index d36e7db..dcd7dfd 100644 --- a/api/tests/unit/normalizer/test_text.py +++ b/api/tests/unit/normalizer/test_text.py @@ -51,6 +51,11 @@ class TestFixLookalikes: def test_empty_table_keeps_text(self) -> None: assert fix_lookalikes("2ОО5", {}) == "2ОО5" + def test_nbsp_replacement(self) -> None: + # неразрывный пробел (U+00A0) → обычный пробел (U+0020) + assert fix_lookalikes("31\xa012\xa02024", LOOKALIKES) == "31 12 2024" + assert fix_lookalikes("31\xa012\xa02024", {}) == "31 12 2024" + @pytest.mark.parametrize( ("raw", "expected"),