import re from typing import Any _PATTERN = re.compile(r"\b(?:кандидат|доктор)(?:\s+[\w-]+){0,12}\s+наук\b|\bph\.?\s*d\.?(?!\w)", re.IGNORECASE) def academic_degrees(data: dict[str, Any] | None) -> list[str]: degrees = [] seen = set() for section in (data or {}).get("sections") or []: if not isinstance(section, dict) or not re.search( r"образован|степен|academic degree|education", str(section.get("title") or ""), re.IGNORECASE ): continue values = [ *(entry.get("text") for entry in section.get("year_entries") or [] if isinstance(entry, dict)), *(section.get("paragraphs") or []), *(section.get("items") or []), section.get("raw_text"), ] table = section.get("table") or {} for row in table.get("rows") or []: if isinstance(row, dict): values.extend(row.get("cells") or []) for value in values: text = str(value or "").strip() for match in _PATTERN.finditer(text): degree = match.group(0).strip() if degree.casefold() not in seen: seen.add(degree.casefold()) degrees.append(degree) return degrees