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

#python #django #django-queryset #python-2.6

#python #django #django-набор запросов #python-2.6

Вопрос:

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

Я нигде не смог найти команду разделения python, ни пример, ни какой-либо ответ на это….

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

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

Пример:

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

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

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

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

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

спасибо, Erez

Комментарии:

1. Вероятно, вам следует добавить пример, чтобы прояснить вопрос.

2. Я обновил свой ответ, чтобы охватить разделение по количеству слов.

3. вы смотрели на перенос в django ulits? делает что-то подобное для фильтра шаблонов — code.djangoproject.com/browser/django/trunk/django/utils /…

Ответ №1:

 >>> 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. 10x’ это здорово, и на самом деле неплохо с моими очень длинными текстами тоже 🙂

Ответ №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