second commit
This commit is contained in:
77
utils.py
77
utils.py
@@ -26,7 +26,7 @@ def parse_all_dirt(sh, min_pos, right, down):
|
||||
RET = set()
|
||||
|
||||
row = min_pos.row
|
||||
while row <= min_pos.row + down:
|
||||
while row < min_pos.row + down:
|
||||
col = min_pos.col
|
||||
while col < min_pos.col + right:
|
||||
#print(excel_coordinate(row, col))
|
||||
@@ -38,6 +38,60 @@ def parse_all_dirt(sh, min_pos, right, down):
|
||||
|
||||
return RET
|
||||
|
||||
import re
|
||||
|
||||
# GEMINI
|
||||
def normalize_name(raw_name):
|
||||
"""
|
||||
Приводит разнородные записи ФИО к единому структурированному виду.
|
||||
"""
|
||||
# Шаг 1: Очистка
|
||||
name = re.sub(r'\s+', ' ', raw_name).strip()
|
||||
|
||||
# Шаг 2: Извлечение звания
|
||||
known_titles = ['проф.', 'доц.', 'акад.', 'к.т.н.', 'д.м.н.']
|
||||
title = None
|
||||
for t in known_titles:
|
||||
if name.lower().startswith(t):
|
||||
title = t
|
||||
# Удаляем звание из строки, убираем лишние пробелы
|
||||
name = name[len(t):].strip()
|
||||
break
|
||||
|
||||
# Шаг 3 и 4: Разделение и идентификация
|
||||
parts = name.split(' ')
|
||||
last_name = None
|
||||
initials = None
|
||||
|
||||
# Простой эвристический анализ
|
||||
# Ищем инициалы (содержат точку или состоят из 1-2 заглавных букв)
|
||||
initials_parts = []
|
||||
name_parts = []
|
||||
|
||||
for part in parts:
|
||||
if '.' in part or (1 <= len(part) <= 2 and part.isupper()):
|
||||
initials_parts.append(part)
|
||||
else:
|
||||
# Считаем все остальное частью фамилии (для двойных фамилий)
|
||||
name_parts.append(part)
|
||||
|
||||
if name_parts:
|
||||
last_name = " ".join(name_parts)
|
||||
|
||||
if initials_parts:
|
||||
initials = "".join(initials_parts) # Сливаем "А." и "Н." в "А.Н."
|
||||
|
||||
# Если фамилия не найдена (например, только инициалы),
|
||||
# но есть части, считаем первую часть фамилией
|
||||
if not last_name and name_parts:
|
||||
last_name = name_parts[0]
|
||||
|
||||
return {
|
||||
"last_name": last_name,
|
||||
"initials": initials,
|
||||
"title": title
|
||||
}
|
||||
|
||||
def excel_coordinate(row, col):
|
||||
"""
|
||||
Преобразует координаты строки и столбца (начиная с 0) в эквивалент Excel (например, A7, CB34).
|
||||
@@ -94,4 +148,23 @@ def find(sh, query = None):
|
||||
return rx, i
|
||||
i += 1
|
||||
|
||||
return None
|
||||
return None
|
||||
|
||||
def weekday_to_num(st: str):
|
||||
if st.upper().strip() == "ПОНЕДЕЛЬНИК":
|
||||
return 1
|
||||
if st.upper().strip() == "ВТОРНИК":
|
||||
return 2
|
||||
if st.upper().strip() == "СРЕДА":
|
||||
return 3
|
||||
if st.upper().strip() == "ЧЕТВЕРГ":
|
||||
return 4
|
||||
if st.upper().strip() == "ПЯТНИЦА":
|
||||
return 5
|
||||
if st.upper().strip() == "СУББОТА":
|
||||
return 6
|
||||
if st.upper().strip() == "ВОСКРЕСЕНЬЕ":
|
||||
return 7
|
||||
|
||||
return -1
|
||||
|
||||
Reference in New Issue
Block a user