举例来说,如果我有以下字符串:有没有办法通过Python中的每个第n个分隔符来分割一个字符串?
“这 - 是 - 一个字符串”
我会受到每2拆分为“ - ”,而不是每一个“ - ”,使其返回两个值(“这是”和“一个字符串”),而不是返回四?
举例来说,如果我有以下字符串:有没有办法通过Python中的每个第n个分隔符来分割一个字符串?
“这 - 是 - 一个字符串”
我会受到每2拆分为“ - ”,而不是每一个“ - ”,使其返回两个值(“这是”和“一个字符串”),而不是返回四?
这里的另一种解决方案:
span = 2
words = "this-is-a-string".split("-")
print ["-".join(words[i:i+span]) for i in range(0, len(words), span)]
编辑:原代码我张贴不工作。这个版本确实如此:
我不认为你可以分裂每一个,但你可以分裂每一个 - 并加入每一对。
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])
这是行不通的,我得到'[“ - ”,“ - ”,“ - ”,“ - ”]' –
这不起作用。输出包含一个包含连字符的1个字符串列表。 – recursive
@Jed他的想法很好,你可以自己写实现。 – 2009-10-25 20:22:45
正则表达式处理这个问题很容易:
import re
s = "aaaa-aa-bbbb-bb-c-ccccc-d-ddddd"
print re.findall("[^-]+-[^-]+", s)
输出:
['aaaa-aa', 'bbbb-bb', 'c-ccccc', 'd-ddddd']
更新尼克d:
n = 3
print re.findall("-".join(["[^-]+"] * n), s)
输出:
['aaaa-aa-bbbb', 'bb-c-ccccc']
>>> 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']
有时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']
这里看到的是一个版本,排序作品与奇数个部分取决于您在这种情况下需要的输出。例如,您可能希望将最后一个元素末尾的'-'
修剪为.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
我觉得几个已经给出解决方案都不够好,但只是为了好玩,我做了这个版本:
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","-")
谢谢,尼克D. – Gumbo
为什么投了票?这个答案有什么问题? – Gumbo
这似乎是分离之间变长的最简单方法。 – Gnuffo1