Как разделить очень длинную строку на список более коротких строк в python

В моем текущем проекте django у меня есть модель, которая хранит очень длинные строки (может быть 5000-10000 или даже больше символов на запись БД), а затем мне нужно разделить их, когда пользователь вызывает запись (она действительно должна быть в одном запись в БД). Что мне нужно, так это вернуть список (набор запросов? зависит от того, находится ли он в части «SQL» или получает весь список как есть и выполняет синтаксический анализ в представлении) более коротких строк (100–500 символов на строку в списке, который я возвращаю к шаблону).

Я нигде не мог найти ни команды разделения Python, ни примера, ни какого-либо ответа на это....

Я всегда мог считать слова и добавлять, но считать слова.... но я уверен, что для такого рода вещей должна быть какая-то функция....

РЕДАКТИРОВАТЬ: спасибо всем, но я думаю, меня не поняли,

Пример:

Строка: «Это очень длинная строка со многими, многими, многими и многими другими предложениями, и нет ни одного символа, который я мог бы использовать для разделения, просто по количеству слов».

строка представляет собой текстовое поле модели django.

мне нужно разделить его, скажем, каждые 5 слов, чтобы я получил:

['Это очень длинная строка','много-много-много-много','и еще много предложений и','нет ни одного символа','который я мог бы использовать для','разделить, просто по количеству',' слов']

Дело в том, что почти в каждом языке программирования есть вспомогательная функция разделить по количеству слов, но я не могу найти ее в python.

спасибо, Эрез


person Erez    schedule 31.05.2011    source источник
comment
Вероятно, вам следует добавить пример, чтобы сделать вопрос более ясным.   -  person Björn Pollex    schedule 31.05.2011
comment
Я обновил свой ответ, чтобы охватить разделение по количеству слов.   -  person Björn Pollex    schedule 31.05.2011
comment
Вы смотрели на обертку в django ulits? делает нечто подобное для фильтра шаблонов — code.djangoproject. com/browser/django/trunk/django/utils/   -  person JamesO    schedule 31.05.2011


Ответы (2)


Вот идея:

def split_chunks(s, chunksize):
    pos = 0
    while(pos != -1):
        new_pos = s.rfind(" ", pos, pos+chunksize)
        if(new_pos == pos):
            new_pos += chunksize # force split in word
        yield s[pos:new_pos]
        pos = new_pos

Это пытается разбить строки на фрагменты длиной не более chunksize. Он пытается разбить пробелы, но если это не удается, он разбивается в середине слова:

>>> foo = "asdf qwerty sderf sdefw regf"
>>> list(split_chunks(foo, 6)
['asdf', ' qwert', 'y', ' sderf', ' sdefw', ' regf', '']

Я предполагаю, что это требует некоторой настройки (например, как обрабатывать разбиения, которые происходят внутри слов), но это должно дать вам отправную точку.


Чтобы разделить по количеству слов, сделайте следующее:

def split_n_chunks(s, words_per_chunk):
    s_list = s.split()
    pos = 0
    while pos < len(s_list):
        yield s_list[pos:pos+words_per_chunk]
        pos += words_per_chunk
person Björn Pollex    schedule 31.05.2011

person    schedule
comment
10x' это здорово, и на самом деле неплохо с моими очень длинными текстами :-) - person Erez; 31.05.2011