假设我的字符串看起来如下,长度不一,但“字”的数量总是等于4的倍数。
9c 75 5a 62 32 3b 3a fe 40 14 46 1c 6e d5 24 de
c6 11 17 cc 3d d7 99 f4 a1 3f 7f 4c
我想将它们分成9c 75 5a 62
和32 3b 3a fe
我可以使用正则表达式来匹配确切的格式,但我想知道是否有更简单的方法来执行此操作,因为正则表达式看起来像是一个简单的问题就过度了。
答案 0 :(得分:9)
这种直截了当的方式如下:
wordlist = words.split()
for i in xrange(0, len(wordlist), 4):
print ' '.join(wordlist[i:i+4])
如果由于某种原因你无法列出所有单词(例如无限流),你可以这样做:
from itertools import groupby, izip
words = (''.join(g) for k, g in groupby(words, ' '.__ne__) if k)
for g in izip(*[iter(words)] * 4):
print ' '.join(g)
免责声明:我没有提出这种模式;我在一段时间内发现了类似的话题。它可以说依赖于一个实现细节,但是当以不同的方式完成时会更加丑陋。
答案 1 :(得分:1)
for x in grouper(words.split(), 4):
print ' '.join(x)
答案 2 :(得分:0)
>>> words = '9c 75 5a 62 32 3b 3a fe 40 14 46 1c 6e d5 24 de'.split()
>>> [' '.join(words[i*4:i*4+4]) for i in range(len(words)/4)]
['9c 75 5a 62', '32 3b 3a fe', '40 14 46 1c', '6e d5 24 de']
或基于1_CR的回答
from itertools import izip_longest
def grouper(iterable, n, fillvalue=None):
"Collect data into fixed-length chunks or blocks"
# grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx
args = [iter(iterable)] * n
return izip_longest(fillvalue=fillvalue, *args)
[' '.join(x) for x in grouper(words.split(), 4)]
答案 3 :(得分:0)
giantString= '9c 75 5a 62 32 3b 3a fe 40 14 46 1c 6e d5 24 de c6 11 17 cc 3d d7 99 f4 a1 3f 7f 4c'
splitGiant = giantString.split(' ')
stringHolders = []
for item in xrange(len(splitGiant)/4):
stringHolders.append(splitGiant[item*4:item*4+4])
stringHolder2 = []
for item in stringHolders:
stringHolder2.append(' '.join(item))
print stringHolder2
这是实现这一目标的最漫长的方式。