Top.Mail.Ru
Ответы

Деление строки по количеству символов, но с условием...

Приветствую. Дана длинная строка (кусок теста). Надо поделить ее на равное количество знаков, вставив "\n". Но, вставить знак надо следующий пробел. То есть: считаем по 80 знаков, но если это не пробел, идем до ближайшего пробела и вставляем. И так по тексту. Я написал функцию, но она не корректно работает, Помогите пожалуйста.

12345678910111213141516
 def str_coll(tx_1,count_n): 
    razr = 0 
    count = 0 
    count1 = count_n 
    insert_text = "\n" 
    for char in tx_1: 
        count += 1 
        if (count % count1 == 0): 
            count1 = count 
            razr = 1 
 
        if (count > count1 and razr == 1): 
            if char == ' ': 
                tx_1 = tx_1[:count] + insert_text + tx_1[count:] 
                razr = 0 
    return tx_1 
Дополнен

Проблему решил. Надо было не добавлять, а заменять знак.
s_list = list(tx_1)
s_list[count] = "\n"
tx_1 = ''.join(s_list)

По дате
По рейтингу
Аватар пользователя
Просветленный
1мес
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
 def str_wrap(text, width=80): 
    """ 
    Разделяет строку на строки максимальной длины width, 
    делая разрывы только после пробелов. 
     
    Args: 
        text (str): Исходный текст для разделения 
        width (int): Максимальная длина строки 
         
    Returns: 
        str: Текст с добавленными символами новой строки 
    """ 
    if not text: 
        return "" 
     
    result = [] 
    current_line = [] 
    current_length = 0 
    last_space_index = -1 
     
    for i, char in enumerate(text): 
        current_line.append(char) 
        current_length += 1 
         
        # Запоминаем позицию последнего пробела 
        if char == ' ': 
            last_space_index = len(current_line) - 1 
         
        # Если достигли максимальной длины строки 
        if current_length >= width: 
            # Если нашли пробел в текущей строке 
            if last_space_index != -1: 
                # Разбиваем по последнему пробелу 
                new_line = ''.join(current_line[:last_space_index]) 
                result.append(new_line) 
                 
                # Оставшуюся часть строки переносим на следующую строку 
                current_line = current_line[last_space_index+1:] 
                current_length = len(current_line) 
                last_space_index = -1 
                 
                # Ищем новый последний пробел в оставшейся части 
                for j, c in enumerate(current_line): 
                    if c == ' ': 
                        last_space_index = j 
            else: 
                # Если пробела нет, просто добавляем всю строку (редкий случай) 
                result.append(''.join(current_line)) 
                current_line = [] 
                current_length = 0 
     
    # Добавляем оставшуюся часть 
    if current_line: 
        result.append(''.join(current_line)) 
     
    return '\n'.join(result) 
 
# Пример использования 
def test_str_wrap(): 
    text = "Это длинный текст, который нужно разбить на строки примерно по 20 символов, но разрывы делать только после пробелов. Это демонстрационный пример для проверки работы функции." 
     
    wrapped = str_wrap(text, 20) 
    print(wrapped) 
     
    # Проверим длину каждой строки 
    for i, line in enumerate(wrapped.split('\n')): 
        print(f"Строка {i+1}: {len(line)} символов") 
 
# Альтернативная реализация с использованием вашего подхода, 
# но с правильной логикой 
def str_wrap_alt(text, width=80): 
    """ 
    Альтернативная реализация разделения текста с заменой пробелов на символы новой строки. 
    """ 
    if not text: 
        return "" 
     
    result = list(text) 
    i = 0 
     
    while i < len(result): 
        # Каждые width символов ищем следующий пробел 
        if i > 0 and i % width == 0: 
            # Ищем следующий пробел 
            j = i 
            while j < len(result) and result[j] != ' ': 
                j += 1 
                 
            # Если нашли пробел, заменяем его на символ новой строки 
            if j < len(result): 
                result[j] = '\n' 
                i = j + 1 
                continue 
         
        i += 1 
     
    return ''.join(result)