Импорт: доп. ОКВЭД нарезаются по кодам (переносы внутри названий больше не рвут записи), угрозы с переносом внутри названия склеиваются (УБИ.209 «памяти\r\nядра процессора» → одна строка)
This commit is contained in:
@@ -544,6 +544,51 @@ def _norm_threat_text(text):
|
||||
return s.lower()
|
||||
|
||||
|
||||
def normalize_threats(text):
|
||||
"""Склеить переносы внутри названий угроз.
|
||||
|
||||
В опросниках встречается «УБИ.209 Угроза … памяти\r\nядра процессора» —
|
||||
перенос строки внутри одного названия. Строка, не начинающаяся с «УБИ.»,
|
||||
считается продолжением предыдущей угрозы.
|
||||
"""
|
||||
if not text:
|
||||
return ''
|
||||
lines = [ln.strip() for ln in str(text).split('\n') if ln.strip()]
|
||||
out = []
|
||||
for ln in lines:
|
||||
if re.match(r'^уби\.?\s*\d+', ln, re.IGNORECASE):
|
||||
out.append(ln)
|
||||
elif out:
|
||||
out[-1] = out[-1] + ' ' + ln
|
||||
else:
|
||||
out.append(ln)
|
||||
return '\n'.join(out)
|
||||
|
||||
|
||||
def split_okved_extra(value):
|
||||
"""Разбить okvedExtra (строка или список строк с переносами) на записи «код название».
|
||||
|
||||
В опросниках доп. ОКВЭД часто идут склеенными:
|
||||
«25.93 — Производство изделий из проволоки\nцепей и пружин 32.12.1 — …»
|
||||
Здесь «цепей и пружин» — продолжение названия 25.93, а 32.12.1 — новый код.
|
||||
Нарезаем по кодам ОКВЭД (двузначный код с точками в начале записи).
|
||||
"""
|
||||
if isinstance(value, (list, tuple)):
|
||||
text = ' '.join(str(x) for x in value)
|
||||
else:
|
||||
text = str(value or '')
|
||||
text = text.replace('\r', ' ').replace('\n', ' ')
|
||||
# Нарезаем по началу кода ОКВЭД: «25.93», «32.12.1», «43.2» …
|
||||
# Перед кодом не должно быть цифры или точки (чтобы не разрезать «25.93» на «25» и «93»)
|
||||
parts = re.split(r'(?<!\d)(?<!\.)(?=\d{2}(?:\.\d+)*\b)', text)
|
||||
out = []
|
||||
for p in parts:
|
||||
p = p.strip().strip('-—– ').strip()
|
||||
if p and re.match(r'^\d{2}(?:\.\d+)*', p):
|
||||
out.append(p)
|
||||
return out
|
||||
|
||||
|
||||
def filter_threats_by_dict(lines, threats_full=None):
|
||||
"""Приводит строки угроз (от ИИ или оператора) к каноническому виду по словарю УБИ.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user