在Python中使用递归编写自动换行功能?

时间:2012-11-02 16:21:01

标签: python word wrapping

def insertNewLine(text, lenght):

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

但问题是这个词正在被我的程序划分......这不应该发生......例如

=&GT;输入:

“随机文字再次换行。”和长度:5

=&GT;我的输出:

Rando
m tex
t to
wrap
again
.

=&GT;预期产出:

Random
text
to wrap
again.

4 个答案:

答案 0 :(得分:0)

这是解决问题的可能方法,我使用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.

答案 1 :(得分:0)

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个,这就是为什么它在Rando被切割的原因。还要记住,空格也算作一个角色。因此,当您的递归通过时,它只是计算5个字符,然后每5个插入一个新行。

答案 2 :(得分:0)

看起来你需要在一定长度后包裹整个单词,并忽略空格;我会做这样的事情:

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是否比你最长的单词短,但这也是一个考虑因素。

答案 3 :(得分:0)

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)

此代码可以正常使用普通文本,我的意思是简单的英语句子只有&#39;,&#39;和&#39;。&#39;作为标点符号,每个标点符号后只有一个空格,就像正常的文章写作一样。如果您想将此代码应用于更完整的文本,我认为您可以自己更新此代码。 我使用&#34;递归&#34;正如你在问题中所要求的那样。我认为这段代码应该对你有所帮助。 我不是python的专家,仍然在学习过程中。希望你能从我的答案中得到你想要的东西。