Как разбить строку на определенный символ (на самом деле набор символов), но с заданной длиной - PullRequest
1 голос
/ 02 июля 2011

Я почти уверен, что есть такой вопрос ..

Вот в чем проблема - я хочу разбить строку, используя некоторые указанные символы в качестве разделителей, но я также хочу, чтобы подстроки имели длину, близкую к указанной.


Пример реального мира - разделение длинных строк субтитров.

Пример:

1234,asd dsa qwerty 567,

Я хочу разбить строку на несколько строк с максимальной длиной, скажем, 10, но я не хочу «разбивать» слова. Итак, это должно стать:

1234,asd
dsa qwerty 
567, 

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

Я думал об использовании str.find (и использовать возвращаемую позицию), но он не может работать с регулярным выражением (из-за различных разделителей - ., ,, ;, \n, , так далее.).

Я думаю о re.findall, но я не могу думать о регулярном выражении. Я думал о чем-то вроде

(.*){, max_len}\s

с re.S, но это явно не работает. Там должен быть какой-то хитрый путь ..

Ответы [ 2 ]

3 голосов
/ 02 июля 2011
In [1]: import textwrap

In [2]: textwrap.wrap('1234,asd dsa qwerty 567,', 10)
Out[2]: ['1234,asd', 'dsa qwerty', '567,']
1 голос
/ 02 июля 2011

Следующий код разбивает вашу строку по желанию на пробелы шириной 10:

import re
r = "1234,asd dsa qwerty 567,"
p = re.compile("(.{,10})($|\s)")
r = p.sub("\\1\n", r)

В этом случае выдает результат

1234,asd
dsa qwerty
567,

при разделении шириной 5 вы получите

1234,asd
dsa
qwerty
567,

Вы можете видеть, что слова никогда не разделяются этим методом.

Если вам нравятся другие разделители, просто замените "\ s" на нужное регулярное выражение.

...