views:

50

answers:

3

I'm processing a bunch of strings and displaying them on a web page.

Unfortunately if a string contains a word that is longer than 60 chars it makes my design implode.

Therefore i'm looking for the easiest, most efficient way to add a whitespace after every 60 chars without whitespaces in a string in python.

I only came up with clunky solutions like using str.find(" ") two times and check if the index difference is > 60.

Any ideas appreciated, thanks.

+2  A: 
>>> import textwrap
>>> help(textwrap.wrap)
wrap(text, width=70, **kwargs)
    Wrap a single paragraph of text, returning a list of wrapped lines.

    Reformat the single paragraph in 'text' so it fits in lines of no
    more than 'width' columns, and return a list of wrapped lines.  By
    default, tabs in 'text' are expanded with string.expandtabs(), and
    all other whitespace characters (including newline) are converted to
    space.  See TextWrapper class for available keyword args to customize
    wrapping behaviour.
>>> s = "a" * 20
>>> s = "\n".join(textwrap.wrap(s, width=10))
>>> print s
aaaaaaaaaa
aaaaaaaaaa

Any extra newlines inserted will be treated as space when the web page is processed by the browser.

Alternatively:

def break_long_words(s, width, fix):
  return " ".join(x if len(x) < width else fix(x) for x in s.split())

def handle_long_word(s):  # choose a name that describes what action you want
  # do something
  return s

s = "a" * 20
s = break_long_words(s, 60, handle_long_word)
Roger Pate
+1 [/thread] textwrap was a nice find.
aaronasterling
textwrap is just perfect, thanks.
endzeit
A: 

def make_wrappable(your_string):
    new_parts = []
    for x in your_string.split():
        if len(x)>60:
            # do whatever you like to shorten it,
            # then append it to new_parts
        else:
            new_parts.append(x)        
    return ' '.join(new_parts)
knitti
A: 
def splitLongWord ( word ):
    segments = list()
    while len( word ) > 0:
        segments.append( a[:60] )
        word = a[60:]
    return ' '.join( segments )

myString = '...' # a long string with words that are longer than 60 characters
words = list()
for word in myString.split( ' ' ):
    if len( word ) <= 60:
        words.append( word )
    else:
        words.extend( splitLongWord( word ) )
myString = ' '.join( words )
poke