Как разделить очень длинную строку на список более коротких строк в Python - PullRequest
3 голосов
/ 31 мая 2011

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

Я нигде не смог найти ни команду Python split, ни пример, ни какой-либо ответ на этот вопрос ...

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

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

Пример:

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

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

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

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

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

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

Ответы [ 2 ]

8 голосов
/ 31 мая 2011
>>> s = "This is a very long string with many many many many and many more sentences and there is not one character that i can use to split by, just by number of words"
>>> l = s.split()
>>> n = 5
>>> [' '.join(l[x:x+n]) for x in xrange(0, len(l), n)]
['This is a very long',
 'string with many many many',
 'many and many more sentences',
 'and there is not one',
 'character that i can use',
 'to split by, just by',
 'number of words']
1 голос
/ 31 мая 2011

Вот идея:

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
...