Написание функции переноса слов с использованием рекурсии в 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)
Этот код корректно работает с обычным текстом, под которым я подразумеваю простые английские предложения только с "," и "." как пунктуация, и после каждой пунктуации есть только один пробел, как при написании эссе. Если вы хотите применить этот код к более полному тексту, я думаю, вы можете обновить этот код самостоятельно. Я использую "рекурсию", как вам требуется в вашем вопросе. Я думаю, что этот код должен быть полезен для вас. Я не специалист по питону, и все еще в процессе обучения. Надеюсь, вы можете получить то, что вы хотите от моего ответа.