• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

  • Приглашаем на KubanCTF

    Старт соревнований 14 сентября в 10:00 по москве

    Ссылка на регистрацию в соревнованиях Kuban CTF: kubanctf.ru

    Кодебай является технологическим партнером мероприятия

программа-словарь перестала работать

раньше работало норм, решил добавить строки чтобы удаляло ненужные тире (что-лио и тд), работало тоже норм, потом перестало работать. то есть с этими строчками 0 слов выводит, а если строки убрать:
1. sich anbiedern bei - втираться в доверие к (кому л)
2. sich bekennen zu - признавать себя причастным к (чему л)
3. demonstrieren für, eintreten für - выступать за (что л)
4. der Anspruch auf (A) - право на (требовать что л)


код:
 
Последнее редактирование:

Koloboking

Green Team
12.01.2017
167
49
BIT
820
раньше работало норм, решил добавить строки чтобы удаляло ненужные тире (что-лио и тд), работало тоже норм, потом перестало работать. то есть с этими строчками 0 слов выводит, а если строки убрать:
1. sich anbiedern bei - втираться в доверие к (кому л)
2. sich bekennen zu - признавать себя причастным к (чему л)
3. demonstrieren für, eintreten für - выступать за (что л)
4. der Anspruch auf (A) - право на (требовать что л)


код:
Основная проблема заключается в том, что строки, содержащие "-л" и "-т", заменяются, но после этих операций строки могут больше не содержат символ "-", который необходим для правильного разделения ключа и значения.

В текущем коде строки, содержащие символы "-л" и "-т", изменяются, и, если после этих замен в строке больше не остается символа "-", код не может правильно разделить строку на ключ и значение, из-за чего словарь остаётся пустым.

Чтобы исправить эту проблему, можно попробовать заменить строки не сразу, а сначала разделить строку на ключ и значение, а затем уже выполнить замены в значении. Вот как это может выглядеть:
Python:
v2 = {}
for v in v3:
    if "-" in v:
        c, b = v.split("-", 1)
        if "-" in b:
            c, b = b.split("-", 1)
        if "*" in c:
            c = c.replace("*", "")
        b = b.replace("-л", " л")
        b = b.replace("-т", " ")
        b = b.replace("кем-чем", "кем чем")
        b = b.replace("по-", " по ")
        for digit in "0123456789":
            b = b.replace(digit, "")
        key = c.strip()
        value = b.strip()
        v2[key] = value

Вариант 2: Проверка на наличие символов перед разделением​

Можно сначала сделать все замены в строке, а потом уже проверять и разделять её по символу "-". Это уменьшит шанс потери разделяющего символа.
Python:
v2 = {}
for v in v3:
    # Замены в строке перед разделением
    v = v.replace("-л", " л")
    v = v.replace("-т", " ")
    v = v.replace("кем-чем", "кем чем")
    v = v.replace("по-", " по ")
    
    for digit in "0123456789":
        v = v.replace(digit, "")
    
    if "-" in v:
        c, b = v.split("-", 1)
        if "*" in c:
            c = c.replace("*", "")
        key = c.strip()
        value = b.strip()
        v2[key] = value

Вариант 3: Использовать регулярные выражения​

Этот вариант использует регулярные выражения для более гибкой обработки строк, особенно если формат строки может изменяться.
Python:
import re

v2 = {}
for v in v3:
    # Замены в строке перед разделением
    v = re.sub(r"-л", " л", v)
    v = re.sub(r"-т", " ", v)
    v = re.sub(r"кем-чем", "кем чем", v)
    v = re.sub(r"по-", " по ", v)
    
    # Удаление цифр
    v = re.sub(r"\d", "", v)
    
    if "-" in v:
        c, b = v.split("-", 1)
        if "*" in c:
            c = c.replace("*", "")
        key = c.strip()
        value = b.strip()
        v2[key] = value

Вариант 4: Использование функции для обработки строки​

Можно создать отдельную функцию, которая сначала выполняет все замены, а затем возвращает разделенные ключ и значение.

Python:
def process_line(v):
    v = v.replace("-л", " л")
    v = v.replace("-т", " ")
    v = v.replace("кем-чем", "кем чем")
    v = v.replace("по-", " по ")
    
    for digit in "0123456789":
        v = v.replace(digit, "")
    
    if "-" in v:
        c, b = v.split("-", 1)
        if "*" in c:
            c = c.replace("*", "")
        return c.strip(), b.strip()
    return None, None

v2 = {}
for v in v3:
    key, value = process_line(v)
    if key and value:
        v2[key] = value

Вариант 5: Проверка наличия разделителя перед заменами​

В этом варианте замены выполняются только в значении после того, как строка уже была разделена.
Python:
v2 = {}
for v in v3:
    if "-" in v:
        c, b = v.split("-", 1)
        if "*" in c:
            c = c.replace("*", "")
        
        # Проверяем, чтобы не потерять разделитель
        if "-" in b:
            c, b = b.split("-", 1)
        
        # Замена символов в значении
        b = b.replace("-л", " л")
        b = b.replace("-т", " ")
        b = b.replace("кем-чем", "кем чем")
        b = b.replace("по-", " по ")
        
        for digit in "0123456789":
            b = b.replace(digit, "")
        
        key = c.strip()
        value = b.strip()
        v2[key] = value
Попробуйте разные варианты и посмотрите, какой из них лучше всего решает вашу задачу.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!