代码之家  ›  专栏  ›  技术社区  ›  Gnuffo1

在python中有没有一种方法可以将字符串按n个分隔符拆分?

  •  12
  • Gnuffo1  · 技术社区  · 15 年前

    例如,如果我有以下字符串:

    “这个字符串”

    我可以把它除以每2个“-”而不是每一个“-”,使它返回两个值(“this is”和“a-string”)而不是返回4吗?

    6 回复  |  直到 11 年前
        1
  •  34
  •   Nick Dandoulakis    15 年前

    下面是另一个解决方案:

    span = 2
    words = "this-is-a-string".split("-")
    print ["-".join(words[i:i+span]) for i in range(0, len(words), span)]
    
        2
  •  16
  •   John La Rooy    15 年前
    >>> s="a-b-c-d-e-f-g-h-i-j-k-l"         # use zip(*[i]*n)
    >>> i=iter(s.split('-'))                # for the nth case    
    >>> map("-".join,zip(i,i))    
    ['a-b', 'c-d', 'e-f', 'g-h', 'i-j', 'k-l']
    
    >>> i=iter(s.split('-'))
    >>> map("-".join,zip(*[i]*3))
    ['a-b-c', 'd-e-f', 'g-h-i', 'j-k-l']
    >>> i=iter(s.split('-'))
    >>> map("-".join,zip(*[i]*4))
    ['a-b-c-d', 'e-f-g-h', 'i-j-k-l']
    

    有时在结果中可以看到迭代工具

    >>> from itertools import izip
    >>> s="a-b-c-d-e-f-g-h-i-j-k-l"
    >>> i=iter(s.split("-"))
    >>> ["-".join(x) for x in izip(i,i)]
    ['a-b', 'c-d', 'e-f', 'g-h', 'i-j', 'k-l']
    

    这是一个版本 某种程度上 使用奇数个部分,这取决于在这种情况下需要什么输出。你可能更喜欢修剪 '-' 在最后一个元素的末尾 .rstrip('-') 例如.

    >>> from itertools import izip_longest
    >>> s="a-b-c-d-e-f-g-h-i-j-k-l-m"
    >>> i=iter(s.split('-'))
    >>> map("-".join,izip_longest(i,i,fillvalue=""))
    ['a-b', 'c-d', 'e-f', 'g-h', 'i-j', 'k-l', 'm-']
    

    这里有一些时间安排

    $ python -m timeit -s 'import re;r=re.compile("[^-]+-[^-]+");s="a-b-c-d-e-f-g-h-i-j-k-l"' 'r.findall(s)'
    100000 loops, best of 3: 4.31 usec per loop
    
    $ python -m timeit -s 'from itertools import izip;s="a-b-c-d-e-f-g-h-i-j-k-l"' 'i=iter(s.split("-"));["-".join(x) for x in izip(i,i)]'
    100000 loops, best of 3: 5.41 usec per loop
    
    $ python -m timeit -s 's="a-b-c-d-e-f-g-h-i-j-k-l"' 'i=iter(s.split("-"));["-".join(x) for x in zip(i,i)]'
    100000 loops, best of 3: 7.3 usec per loop
    
    $ python -m timeit -s 's="a-b-c-d-e-f-g-h-i-j-k-l"' 't=s.split("-");["-".join(t[i:i+2]) for i in range(0, len(t), 2)]'
    100000 loops, best of 3: 7.49 usec per loop
    
    $ python -m timeit -s 's="a-b-c-d-e-f-g-h-i-j-k-l"' '["-".join([x,y]) for x,y in zip(s.split("-")[::2], s.split("-")[1::2])]'
    100000 loops, best of 3: 9.51 usec per loop
    
        3
  •  9
  •   recursive    15 年前

    正则表达式很容易处理:

    import re
    s = "aaaa-aa-bbbb-bb-c-ccccc-d-ddddd"
    print re.findall("[^-]+-[^-]+", s)
    

    输出:

    ['aaaa-aa', 'bbbb-bb', 'c-ccccc', 'd-ddddd']
    

    Nick D的更新:

    n = 3
    print re.findall("-".join(["[^-]+"] * n), s)
    

    输出:

    ['aaaa-aa-bbbb', 'bb-c-ccccc']
    
        4
  •  1
  •   EmFi    15 年前

    编辑: 我发布的原始代码不起作用。此版本:

    我不认为你可以拆分其他的,但你可以分摊每一个,并加入每一对。

    chunks = []
    content = "this-is-a-string"
    split_string = content.split('-')
    
    for i in range(0, len(split_string) - 1,2) :
        if i < len(split_string) - 1:
            chunks.append("-".join([split_string[i], split_string[i+1]]))
        else:
            chunks.append(split_string[i])
    
        5
  •  0
  •   elzapp    15 年前

    我认为一些已经给出的解决方案已经足够好了,但是为了好玩,我做了这个版本:

    def twosplit(s,sep):
      first=s.find(sep)
      if first>=0:
        second=s.find(sep,first+1)
          if second>=0:
            return [s[0:second]] + twosplit(s[second+1:],sep)
          else:
            return [s]
        else:
          return [s]
      print twosplit("this-is-a-string","-")
    
        6
  •  -1
  •   SpliFF    15 年前
    l = 'this-is-a-string'.split()
    nl = []
    ss = ""
    c = 0
    for s in l:
       c += 1
       if c%2 == 0:
           ss = s
       else:
           ss = "%s-%s"%(ss,s)
           nl.insert(ss)
    
    print nl