import re from functools import lru_cache @lru_cache(None) def partialize(s): s = s.lower().replace("ё", "е") p = re.split("[. ]+", s) return list(filter(lambda a: a, p)) def test_short(short: str, full: str) -> bool: short_parts = partialize(short) full_parts = partialize(full) for i in range(min(len(short_parts), len(full_parts))): if not full_parts[i].startswith(short_parts[i]): return False return True def find_in_list(short, full_list): result = [] for item in full_list: if test_short(short, item): result.append(item) if len(result) == 1: return result[0] elif short in result: return short else: return result def find_teacher_by_date(input_string, target_date): """ Ищет преподавателя по целевой дате в строке с датами и ФИО. :param input_string: Строка с датами и ФИО преподавателей. :param target_date: Целевая дата в формате "%d.%m". :return: ФИО преподавателя, связанного с целевой датой, или None, если дата не найдена. """ # Преобразуем целевую дату в формат "%d.%m" target_date_str = target_date#.strftime("%d.%m") # Регулярное выражение для поиска дат в формате "%d.%m" date_pattern = re.compile(r"\d{2}\.\d{2}") # Разделяем строку на строки по переносам lines = re.split(" {5,}", input_string) # Проходим по каждой строке for line in lines: # Разделяем строку на даты и ФИО parts = line.strip().split() # Извлекаем даты и ФИО dates = [] teacher = "" for part in parts: if date_pattern.fullmatch(part.replace(",", "")): # Убираем запятые, если они есть dates.append(part.replace(",", "")) # Убираем запятые, если они есть else: teacher += part + " " # Собираем ФИО # Проверяем, есть ли целевая дата в списке дат if target_date_str in dates: return teacher.strip() # Возвращаем ФИО преподавателя # Если дата не найдена return input_string if __name__ == "__main__": # print(test_short("кузнецов в.н.", "Кузнецов Владимир Николаевич")) s = " 10.02, 24.02, 10.03 Абдусалямова Л.И . 27.01, 07.04 Голубцова Т.С. 24.03 Шаршова С.М. " print(find_teacher_by_date(s, "10.03"))