Python长字符串以x字符长行的对齐文本

时间:2015-09-04 23:04:02

标签: python regex

作为一项任务,我必须输入一长串文本,然后输出它,每行为x个字符长。 我试图使用的当前方法不起作用,我无法弄清楚为什么,它只是陷入无限循环。

我希望在调试代码方面有所帮助。

代码:

words = 'Etiam rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper libero, sit amet adipiscing sem neque sed ipsum. Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id, lorem. Maecenas nec odio et ante tincidunt tempus. Donec vitae sapien ut libero venenatis faucibus. Nullam quis ante. Etiam sit amet orci eget eros faucibus tincidunt. Duis leo. Sed fringilla mauris sit amet nibh. Donec sodales sagittis magna. Sed consequat, leo eget bibendum sodales, augue velit cursus nunc, quis gravida magna mi a libero. Fusce vulputate eleifend sapien. Vestibulum purus quam, scelerisque ut, mollis sed, nonummy id, metus. Nullam accumsan lorem in dui. Cras ultricies mi eu turpis hendrerit fringilla. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In ac dui quis mi consectetuer lacinia.'.split()
max_len = 60
line = ''
lines = []
for word in words:
    if len(line) + len(word) <= max_len:
        line += (' ' + word)
    else:
        lines.append(line.strip())
        line = ''

import re
def JustifyLine(oline, maxLen):
    if len(oline) < maxLen:
        s = 1
        nline = oline
        while len(nline) < maxLen:
            match = '\w(\s{%i})\w' % s
            replacement = ' ' * (s + 1)
            nline = re.sub(match, replacement, nline, 1)
            if len(re.findall(match, nline)) == 0:
                s = s + 1
                replacement = s + 1
            elif len(nline) == maxLen:
                return nline
    return oline

for l in lines[:-1]:
    string = JustifyLine(l, max_len)
    print(string)

2 个答案:

答案 0 :(得分:1)

您的主要问题是您正在用更多的空格替换letter-whitespace字母,删除其两侧的字母。所以你的线永远不会变长,你的循环永远不会终止。

将字母放在各自的组中,并将引用(例如\ 1)添加到替换字符串中。

答案 1 :(得分:1)

斯蒂芬的回答比你给你的要多一些。

对未来的建议:

  1. 确定哪个循环没有终止。例如将print语句添加到可疑循环中。每个人都有不同的角色。
  2. 打印出循环条件的键值,并检查它们是否以正确的方向前进。在这种情况下,nline的长度。如果每次都没有增加,你需要担心它不会终止。
  3. 在有两个循环退出(循环和返回的条件)之前仔细考虑,这会使得更难以推断行为。