Разделение только длинных слов в строке - PullRequest
1 голос
/ 17 марта 2010

У меня есть случайная строка, скажем:

s = "This string has some verylongwordsneededtosplit"

Я пытаюсь написать функцию trunc_string (string, len), которая принимает строку в качестве аргумента для работы и len в качестве числа символов после разделения длинных слов.

Результат должен быть примерно таким

str = trunc_string(s, 10)
str = "This string has some verylongwo rdsneededt osplit"

Пока у меня есть что-то вроде этого:

def truncate_long_words(s, num):
"""Splits long words in string"""
words = s.split()
for word in words:
    if len(word) > num:
        split_words = list(words)

После этой части у меня есть это длинное слово в виде списка символов. Теперь мне нужно:

  • объединить num символов во временный список word_part
  • объединить все word_parts в одно слово
  • соедините это слово с остальными словами, которых было недостаточно для разделения.

Должен ли я сделать это каким-то подобным образом? :

counter = 0
for char in split_words:
    word_part.append(char)
    counter = counter+1
    if counter == num

И здесь я должен как-то объединить все word_part вместе, создавая слово и далее

Ответы [ 4 ]

6 голосов
/ 17 марта 2010
def split_word(word, length=10):
    return (word[n:n+length] for n in range(0, len(word), length))

string = "This string has some verylongwordsneededtosplit"

print [item for word in string.split() for item in split_word(word)]
# ['This', 'string', 'has', 'some', 'verylongwo', 'rdsneededt', 'osplit']

Примечание: неправильно называть вашу строку str. Затеняет встроенный тип.

5 голосов
/ 30 октября 2012

опция текстового модуля
http://docs.python.org/2/library/textwrap.html

пример использования:

>>> import textwrap
>>> s = "This string has some verylongwordsneededtosplit"
>>> list = textwrap.wrap(s, width=10)
>>> for line in list: print line;
... 
This
string has
some veryl
ongwordsne
ededtospli
t
>>>
3 голосов
/ 17 марта 2010

Злоупотребление регулярным выражением:

import re
def trunc_string(s, num):
   re.sub("(\\w{%d}\\B)" % num, "\\1 ", s)

assert "This string has some verylongwo rdsneededt osplit" == trunc_string("This string has some verylongwordsneededtosplit", 10)

(Редактировать: Брайан принял упрощение. Спасибо. Но я сохранил \B, чтобы не добавлять пробел, когда слово ровно 10 символов.)

3 голосов
/ 17 марта 2010

Почему бы и нет:

  def truncate_long_words(s, num):
     """Splits long words in string"""
     words = s.split()
     for word in words:
        if len(word) > num:
                for i in xrange(0,len(word),num):
                       yield word[i:i+num]
        else:
            yield word

 for t in truncate_long_words(s):
    print t
...