有没有办法在Python中每隔第n个分隔符拆分一个字符串?

Gnu*_*fo1 18 python string split

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

"这 - 是 - 一个字符串"

我可以每隔2个" - "而不是每个" - "拆分它,以便它返回两个值("this-is"和"a-string")而不是返回四个?

Gum*_*mbo 37

这是另一个解决方案:

span = 2
words = "this-is-a-string".split("-")
print ["-".join(words[i:i+span]) for i in range(0, len(words), span)]
Run Code Online (Sandbox Code Playgroud)


Joh*_*ooy 16

>>> 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']
Run Code Online (Sandbox Code Playgroud)

有时itertools.izip更快,你可以在结果中看到

>>> 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']
Run Code Online (Sandbox Code Playgroud)

这是一个版本,根据您在这种情况下所需的输出,可以使用奇数个部件.例如,您可能更喜欢修剪'-'掉最后一个元素的末尾.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-']
Run Code Online (Sandbox Code Playgroud)

这是一些时间安排

$ 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
Run Code Online (Sandbox Code Playgroud)

  • 您的提案使用了错误的代码.我正在操作不是字符串的单词.`python -m timeit -s's ="abcdefghijkl".split(" - ")''[" - ".join(s [i:i + 2])for i in range(0,len(s), 2)]'` (2认同)

rec*_*ive 9

正则表达式可以轻松处理:

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

输出:

['aaaa-aa', 'bbbb-bb', 'c-ccccc', 'd-ddddd']
Run Code Online (Sandbox Code Playgroud)

Nick D的更新:

n = 3
print re.findall("-".join(["[^-]+"] * n), s)
Run Code Online (Sandbox Code Playgroud)

输出:

['aaaa-aa-bbbb', 'bb-c-ccccc']
Run Code Online (Sandbox Code Playgroud)