Сначала проверьте JSON с целочисленным value, затем ищите первое целое число в обычном тексте. Явно определите приоритет форматов и поведение при нескольких числах.
Извлечение целого числа из произвольной строки
Сначала проверьте JSON с целочисленным value, затем ищите первое целое число в обычном тексте. Явно определите приоритет форматов и поведение при нескольких числах.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Напишите функцию, принимающую строку и возвращающую целочисленное значение, если оно присутствует. Число в исходном тексте может быть представлено двумя способами:
- Прямое текстовое представление (например, "42" – символы "4" и "2").
- JSON‑объект, где есть поле "value", содержащее число (например, "{"value": 42}"). Строка может также включать произвольный «мусор» – любые другие символы. Если извлечь число не удалось, функция должна вернуть None. Бонус: оформить решение в объектно‑ориентированном стиле, используя полиморфизм для разных форматов входных данных.
Ответ
Сначала проверьте JSON с целочисленным value, затем ищите первое целое число в обычном тексте. Явно определите приоритет форматов и поведение при нескольких числах.
Ниже корректный JSON считается самостоятельным форматом: посторонние поля не используются как запасной источник числа.
import json
import re
def extract_integer(text):
try:
parsed = json.loads(text)
except (json.JSONDecodeError, ValueError):
match = re.search(r'[+-]?[0-9]+', text)
if not match:
return None
try:
return int(match.group())
except ValueError:
return None
if type(parsed) is int:
return parsed
if isinstance(parsed, dict) and type(parsed.get('value')) is int:
return parsed['value']
return None
Булевы значения не принимаются за числа. Для бонуса выделите JsonParser и TextIntegerParser с общим методом parse, различая «формат не подходит» и «формат распознан, числа нет». JSON, встроенный в мусорный текст, требует отдельного правила выделения границ.