75 lines
3.0 KiB
Python
75 lines
3.0 KiB
Python
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")) |