Написание функции переноса слов с использованием рекурсии в Python?

def insertNewLine(text, lenght):

    if len(text) < lenght:
        return text
    else:
        print text[:lenght]
        return (text[:lenght]+'\n'+ insertNewLine(text[lenght:],lenght))

но проблема в том, что слово делится на мою программу.. это не должно происходить.. например

=> Ввод:

"Случайный текст, чтобы снова обернуть." и длина: 5

=> Мой вывод:

Rando
м текс
т к
заворачивать
снова,

=> Ожидаемый результат:

случайный
текст
обернуть
снова.

4 ответа

Похоже, вам нужно обернуть целые слова после определенной длины и игнорировать пробелы; Я бы сделал что-то вроде этого:

def wrap(text, length):
    words = text.split()
    lines = []
    line = ''
    for w in words:
        if len(w) + len(line) > length:
            lines.append(line)
            line = ''
        line = line + w + ' '
        if w is words[-1]: lines.append(line)
    return '\n'.join(lines)

Это в основном работает, разбивая текст на целые слова, а затем собирая их строки до длины переноса. Таким образом, вам не нужно выяснять, пытаетесь ли вы сломать слово. Я не удосужился проверить, length короче, чем ваше самое длинное слово, но это тоже соображение.

Это возможное решение вашей проблемы, я использую модуль re python, чтобы расположить символы \n в нужном месте.

import re
def insertNewLine(text, lenght):
    return re.sub('((.*){' + str(lenght-1) + ',}?)\s', '\g<1>\n', text)

if __name__ == "__main__":
    print insertNewLine("Random text to wrap again.", 5)

>>>python test.py 
Random
text
to wrap
again.
def insertNewLine(text, lenght):

if len(text) < lenght:
    return text
else:
    print text[:lenght]
    return (text[:lenght]+'\n'+ insertNewLine(text[lenght:],lenght))

"Случайный текст, чтобы снова обернуть." и длина: 5

Проблема в том, что вы говорите с

'\n'

Что вы хотите новую строку когда-либо 5 символов. Слово "Рандом" имеет 6, поэтому его обрезают на Рандо. Также помните, что пробелы также считаются символом. Поэтому, когда ваша рекурсия проходит, она просто считает 5 символов, а затем вставляет новую строку каждые 5.

def insertNewline(text, length):
    '''
    This function can only be applied to normal text.
    '''
    if len(text) <= length:
        print(text)
        return
    elif text[length - 1] == ' ':
        print(text[:length - 1])
        return insertNewline(text[(length):], length)
    elif text[length] == ' ':
        print(text[:length])
        return insertNewline(text[(length + 1):], length)        
    else:
        i = 0
        while text[length + i] != ' ' and text[length + i] != ',' and text[length + i] != '.':
            i += 1
        if text[length + i] == ' ':
            print(text[:(length + i)])
            return insertNewline(text[(length + i + 1):], length)
        else:
            print(text[:(length + i + 1)])
            return insertNewline(text[(length + i + 2):], length)

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

Другие вопросы по тегам