ЧТМ:Центр управления модулями/скрипт сбора статистики турниров: различия между версиями
Burato (обсуждение | вклад) м Burato переименовал страницу Участник:Burato/скрипт в ЧТМ:ЧТМ:Центр управления модулями/скрипт сбора статистики турниров без оставления перенаправления |
LordBot (обсуждение | вклад) м Замена текста — «lang="py">» на «lang="python" line>» |
||
| (не показаны 3 промежуточные версии 2 участников) | |||
| Строка 1: | Строка 1: | ||
<syntaxhighlight lang=" | <syntaxhighlight lang="python" line>import re | ||
# ========================================== | # ========================================== | ||
| Строка 5: | Строка 5: | ||
# ========================================== | # ========================================== | ||
TOURNAMENT = "ЧТМ" # Укажите название турнира | TOURNAMENT = "ЧТМ" # Укажите название турнира | ||
YEAR = " | YEAR = "2046" # Укажите год | ||
IS_QUALIFICATION = True # True = Квалификация (_Qual), False = Финальный турнир | IS_QUALIFICATION = True # True = Квалификация (_Qual), False = Финальный турнир | ||
# ========================================== | # ========================================== | ||
# 2. ВСТАВЬТЕ ВАШ ТЕКСТ СЮДА | # 2. ВСТАВЬТЕ ВАШ ТЕКСТ ИЗ ВИКИПЕДИИ СЮДА | ||
# ========================================== | # ========================================== | ||
DATA = """ | DATA = """ | ||
| Строка 29: | Строка 29: | ||
STAGE_MAP = { | STAGE_MAP = { | ||
"Квалификация": "Qualification", | |||
"Первый тур": "Stage1", | "Первый тур": "Stage1", | ||
"Второй тур": "Stage2", | "Второй тур": "Stage2", | ||
| Строка 35: | Строка 36: | ||
"1/8 финала": "8thfinal", | "1/8 финала": "8thfinal", | ||
"1/4 финала": "Quarterfinal", | "1/4 финала": "Quarterfinal", | ||
"Четвертьфиналы": "Quarterfinal", | |||
"Четвертьфинал": "Quarterfinal", | |||
"Полуфиналы": "Semifinal", | "Полуфиналы": "Semifinal", | ||
"Полуфинал": "Semifinal", | "Полуфинал": "Semifinal", | ||
| Строка 40: | Строка 43: | ||
"Финал": "Final" | "Финал": "Final" | ||
} | } | ||
CONFED_MAP = { | |||
"Южная Америка": "SouthAmerica", | |||
"Северная Америка": "NorthAmerica", | |||
"Америка": "America", | |||
"Евразия": "Eurasia", | |||
"Африка": "Africa", | |||
"Океания": "Oceania", | |||
"Европа": "Europe", | |||
"Азия": "Asia" | |||
} | |||
# Сортируем ключи по длине (по убыванию), чтобы Южная Америка проверялась раньше Америки | |||
CONFED_KEYS = sorted(CONFED_MAP.keys(), key=len, reverse=True) | |||
def parse_score(score_str, team1, team2, c1, c2, venue, is_second_leg=False): | def parse_score(score_str, team1, team2, c1, c2, venue, is_second_leg=False): | ||
| Строка 68: | Строка 84: | ||
out = [] | out = [] | ||
tournament_key = f"{TOURNAMENT}_{YEAR}" | tournament_key = f"{TOURNAMENT}_{YEAR}" | ||
if IS_QUALIFICATION: | if IS_QUALIFICATION: | ||
| Строка 77: | Строка 92: | ||
current_round = "" | current_round = "" | ||
current_stage = "" | current_stage = "" | ||
current_confed = "" | |||
is_add_matches = False | is_add_matches = False | ||
is_neutral_global = False | is_neutral_global = False | ||
| Строка 96: | Строка 113: | ||
out.append(f' ["{key}"] = {{') | out.append(f' ["{key}"] = {{') | ||
out.append(' type = "group",') | out.append(' type = "group",') | ||
if current_confed: | |||
out.append(f' confederation = "{current_confed}",') | |||
out.append(' standings = {') | out.append(' standings = {') | ||
for tm, col in zip(group_teams, group_colors): | for tm, col in zip(group_teams, group_colors): | ||
| Строка 129: | Строка 149: | ||
out.append(f' ["{key}"] = {{') | out.append(f' ["{key}"] = {{') | ||
out.append(' type = "knockout",') | out.append(' type = "knockout",') | ||
if current_confed: | |||
out.append(f' confederation = "{current_confed}",') | |||
out.append(' matches = {') | out.append(' matches = {') | ||
for m in knockout_matches: | for m in knockout_matches: | ||
| Строка 139: | Строка 162: | ||
if not line: continue | if not line: continue | ||
# | # Защита от прилипших скобок | ||
close_table_now = False | close_table_now = False | ||
if line.endswith("}}"): | if line.endswith("}}"): | ||
close_table_now = True | close_table_now = True | ||
line = line[:-2].strip() | line = line[:-2].strip() | ||
if not line and close_table_now: | if not line and close_table_now: | ||
if in_group: flush_group() | if in_group: flush_group() | ||
| Строка 153: | Строка 175: | ||
continue | continue | ||
# Проверка нейтрального поля | |||
if "нейтральном поле" in line.lower() or "на нейтральном" in line.lower(): | if "нейтральном поле" in line.lower() or "на нейтральном" in line.lower(): | ||
is_neutral_global = True | is_neutral_global = True | ||
# СМЕНА РАУНДА | |||
m_round = re.match(r'===\s*(.+?)\s*===', line) | m_round = re.match(r'===\s*(.+?)\s*===', line) | ||
if m_round: | if m_round: | ||
| Строка 163: | Строка 187: | ||
current_round = ROUND_MAP.get(raw_round, "Round") | current_round = ROUND_MAP.get(raw_round, "Round") | ||
is_add_matches = False | is_add_matches = False | ||
current_confed = "" # Сбрасываем конфедерацию при новом раунде | |||
if current_round in ["Playoffs", "AddTournament", "Qual"]: | if current_round in ["Playoffs", "AddTournament", "Qual"]: | ||
current_stage = current_round | current_stage = current_round | ||
current_round = "" | current_round = "" | ||
continue | continue | ||
# ПОИСК КОНФЕДЕРАЦИИ (только если мы не внутри таблицы) | |||
if not in_group and not in_knockout: | |||
for ck in CONFED_KEYS: | |||
if ck in line: | |||
current_confed = CONFED_MAP[ck] | |||
break # Если нашли длинное имя (например Южная Америка), дальше не ищем | |||
if "; Дополнительные матчи" in line: | if "; Дополнительные матчи" in line: | ||
| Строка 172: | Строка 204: | ||
continue | continue | ||
# СМЕНА СТАДИИ / ГРУППЫ | |||
m_stage = re.match(r';:?\s*(.+)', line) | m_stage = re.match(r';:?\s*(.+)', line) | ||
if m_stage and "Дополнительные" not in m_stage.group(1): | if m_stage and "Дополнительные" not in m_stage.group(1): | ||
| Строка 184: | Строка 217: | ||
continue | continue | ||
# НАЧАЛО ТАБЛИЦЫ ГРУППЫ | |||
m_g_start = re.search(r'\{\{Группа\s*\d+-А(\d)', line) | m_g_start = re.search(r'\{\{Группа\s*\d+-А(\d)', line) | ||
if m_g_start: | if m_g_start: | ||
| Строка 190: | Строка 224: | ||
continue | continue | ||
# НАЧАЛО ТАБЛИЦЫ ПЛЕЙ-ОФФ | |||
if re.search(r'\{\{И\d+', line): | if re.search(r'\{\{И\d+', line): | ||
in_knockout = True | in_knockout = True | ||
continue | continue | ||
# ПАРСИНГ СТРОКИ ГРУППЫ | |||
if in_group: | if in_group: | ||
m_row = re.match(r'^([A-Za-z]{1,2})\|([А-ЯЁ]{3})\|(.*?)\|*$', line) | m_row = re.match(r'^([A-Za-z]{1,2})\|([А-ЯЁ]{3})\|(.*?)\|*$', line) | ||
| Строка 203: | Строка 239: | ||
group_matrix.append(scores) | group_matrix.append(scores) | ||
# ПАРСИНГ СТРОКИ ПЛЕЙ-ОФФ | |||
if in_knockout: | if in_knockout: | ||
m_ko = re.match(r'^\|?([A-Za-z]{1,2})\|([А-ЯЁ]{3})\|([^\|]+)\|([А-ЯЁ]{3})\|([A-Z-a-z]{1,2})', line) | m_ko = re.match(r'^\|?([A-Za-z]{1,2})\|([А-ЯЁ]{3})\|([^\|]+)\|([А-ЯЁ]{3})\|([A-Z-a-z]{1,2})', line) | ||
| Строка 216: | Строка 253: | ||
knockout_matches.append(parsed_leg) | knockout_matches.append(parsed_leg) | ||
# | # КОНЕЦ ТАБЛИЦЫ (если скобки были прилипшими к последней строке) | ||
if close_table_now: | if close_table_now: | ||
if in_group: flush_group() | if in_group: flush_group() | ||
| Строка 233: | Строка 270: | ||
if __name__ == "__main__": | if __name__ == "__main__": | ||
main() | main()</syntaxhighlight> | ||