是否有一种很好的方法来分割(可能)长字符串而不在Python中分割单词?

时间:2012-04-01 20:44:42

标签: python string split word wrapping

我想确保我只打印最多80个字符的长行,但我有一个字符串s,它可以更短,更长。所以我想把它分成行而不用分割任何单词。

长字符串示例:

s = "This is a long string that is holding more than 80 characters and thus should be split into several lines. That is if everything is working properly and nicely and all that. No mishaps no typos. No bugs. But I want the code too look good too. That's the problem!"

我可以设法这样做:

words = s.split(" ")
line = ""
for w in words:
    if len(line) + len(w) <= 80:
        line += "%s " % w
    else:
        print line
        line ="%s " % w

print line

同样,我可以在while循环中迭代使用s.find(" ")

sub_str_left = 0
pos = 0
next_pos = s.find(" ", pos)
while next_pos > -1:
    if next_pos - sub_str_left > 80:
        print s[sub_str_left:pos-sub_str_left]
        sub_str_left = pos + 1

    pos = next_pos
    next_pos = s.find(" ", pos)

print s[sub_str_left:]

这些都不是很优雅,所以我的问题是,如果有更酷的pythonic方式吗? (也许是正则表达式。)

4 个答案:

答案 0 :(得分:14)

有一个模块:textwrap

例如,您可以使用

print '\n'.join(textwrap.wrap(s, 80))

print textwrap.fill(s, 80)

答案 1 :(得分:2)

import re
re.findall('.{1,80}(?:\W|$)', s)

答案 2 :(得分:2)

import re

s = "This is a long string that is holding more than 80 characters and thus should be split into several lines. That is if everything is working properly and nicely and all that. No misshaps no typos. No bugs. But I want the code too look good too. That's the problem!"

print '\n'.join(line.strip() for line in re.findall(r'.{1,80}(?:\s+|$)', s))

<强>输出:

This is a long string that is holding more than 80 characters and thus should be
split into several lines. That is if everything is working properly and nicely
and all that. No misshaps no typos. No bugs. But I want the code too look good
too. That's the problem!

答案 3 :(得分:0)

你可以尝试这个python脚本

import os, sys, re
s = "This is a long string that is holding more than 80 characters and thus should be split into several lines. That is if everything is working properly and nicely and all that. No misshaps no typos. No bugs. But I want the code too look good too. That's the problem!"
limit = 83
n = int(len(s)/limit)
b = 0
j= 0
for i in range(n+2):

    while 1:
        if s[limit - j] not in [" ","\t"]:
            j = j+1
        else:
            limit = limit - j
            break
    st = s[b:i*limit]
    print st
    b = i*limit