【问题标题】:How to split a string into chunks per number of characters and delimiter?如何根据字符数和分隔符将字符串拆分为块?
【发布时间】:2020-02-14 01:31:19
【问题描述】:

给定:

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 个分隔符 here 分割的位置。

【问题讨论】:

  • 您对 s='foo,bar,cow' 和 n=5 有什么期望?
  • ['foo','bar','cow']
  • 在 s='foobar,cow' 和 n=5 的情况下呢?
  • ['foobar','cow']

标签: python string split


【解决方案1】:

您可以使用functools.reduce 来完成此操作。

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]]))

【讨论】:

  • 我正在写一个递归生成器的东西,但你的解决方案更好。
  • 这非常接近,但只有一件事:s = 'foo, bar, baz, qudz', n = 10 返回 ['foo bar', 'baz qudz'] 但我需要 [ 'foo, bar', 'baz, qudz']
  • acc[-1] = tmp1 + v 更改为 acc[-1] = tmp1 + ',' + v 将解决此问题(如在更新的解决方案中所做的那样)。
  • 我的男人!我只是将它拆分为 ', ' (逗号后有一个空格),效果很好。我希望我能给出这 10 个“正确答案”。
【解决方案2】:

您可以使用正则表达式来获取这样的子字符串...

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

我发现自己在发布后对此进行了编辑。正则表达式很棘手,但如果不准确,这也接近于解决方案。也许需要一些微调。比赛结束时可能会有一个空格 - 可以修剪掉。

【讨论】:

  • 如果逗号算作十个字符之一,那么这可能是最好的正则表达式:re.findall(r"\w[\w, ]{1,8}(?:, |\w$)", "foo, bar, baz, qudz") 它假定我们不希望子字符串的起始字符是逗号。
猜你喜欢
  • 2019-09-19
  • 2012-08-09
  • 2023-04-06
  • 2020-04-18
  • 2020-04-11
  • 1970-01-01
  • 2019-02-06
  • 2011-08-04
  • 2013-10-19
相关资源
最近更新 更多