Как разбить строку на куски по количеству символов и разделителю? - PullRequest
1 голос
/ 14 февраля 2020

Учитывая:

s = 'foo, bar, baz, qudz'

Я хотел бы разбить эту строку по 2 критериям:

  1. количество символов n (в этом случае я буду использовать n = 10 )
  2. разделитель: "," (перед n-ым символом)

Желаемый результат:

['foo, bar', 'baz, qudz']

Я знаю, что достаточно легко разделить его по разделителю :

s.split(', ')
['foo', 'bar', 'baz', 'qudz']

Я также знаю, что могу разбить его на четные куски n следующим образом:

[s[i:i+n] for i in range(0, len(s), n)]

Я также видел, где можно разделить на n-й разделитель здесь .

Ответы [ 2 ]

2 голосов
/ 14 февраля 2020

Вы можете использовать functools.reduce для выполнения sh этого.

import functools


def splitter(s, n):
    def helper(acc, v):
        tmp1 = acc[-1] 
        tmp2 = len(tmp1)
        if tmp2 >= n or tmp2 + len(v) >= n:
            acc.append(v)
        else:
            acc[-1] = tmp1 + ',' + v

        return acc

    tmp1 = s.split(',')
    if len(tmp1) == 1:
        return tmp1

    return list(functools.reduce(helper, tmp1[1:], [tmp1[0]]))
1 голос
/ 14 февраля 2020

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

>>> re.findall(r"[\w,][\w, ]{1,8},?", "foo, bar, baz, qudz")
['foo, bar,', 'baz, qudz']

Я исправляю это после публикации. Регулярные выражения хитры, но это близко к решению, если не точное. Может быть, нужна какая-то тонкая настройка. В конце матчей может быть пробел, который можно обрезать.

...