如何将字符串每三个字符分割一次?

12
我正在使用Python为我所在的实验室编写程序。如何从给定字符串中切出每3个字符并将其附加到列表中?
例如,XXXxxxXXXxxxXXXxxxXXXxxxXXX(其中X或x是任何给定字母)。
string = 'XXXxxxXXXxxxXXXxxxXXXxxxXXX'
mylist = []

for x in string:
    string[?:?:?]
    mylist.append(string)
我希望列表看起来像这样:['XXX','xxx','XXX','xxx','XXX'....等等]
有什么建议吗?

3
这与按块迭代列表非常相似 - 请查看那里的答案,了解一些出色的方法。 - Ben Blank
4个回答

20

简而言之,你不能。

更详细地说,你需要编写自己的函数,可能是:

def split(str, num):
    return [ str[start:start+num] for start in range(0, len(str), num) ]
例如:
>>> split("xxxXXX", 3)
['xxx', 'XXX']
>>> split("xxxXXXxx", 3)
['xxx', 'XXX', 'xx']

7

将列表分成三个一组和将字符串分成三个一组的区别之一是re模块使用的是字符串而不是列表。

如果性能很重要(比如你需要分割数千个字符串),那么你应该在你的应用程序中测试各种答案的表现如何。

>>> import re
>>> re.findall('...','XXXxxxXXXxxxXXXxxxXXXxxxXXX')
['XXX', 'xxx', 'XXX', 'xxx', 'XXX', 'xxx', 'XXX', 'xxx', 'XXX']

>>> chunksize=3
>>> re.findall('.{%s}'%chunksize,'XXXxxxXXXxxxXXXxxxXXXxxxXXX')
['XXX', 'xxx', 'XXX', 'xxx', 'XXX', 'xxx', 'XXX', 'xxx', 'XXX']

这个可以工作是因为在正则表达式中,. 表示“匹配任何字符”。
.{3} 表示“匹配任意3个字符”,以此类推。

4
据我所知,没有内置的方法可以让您每隔x个字符切割一个字符串。但是,以下方法可行:
 str = "stringStringStringString"

 def chunk_str(str, chunk_size):
   return [str[i:i+chunk_size] for i in range(0, len(str), chunk_size)]

 chunk_str(str,3)

生成:

['str', 'ing', 'Str', 'ing', 'Str', 'ing', 'Str', 'ing']

不用.split()方法吗? - Francis
不行 - .split 方法只能根据字符进行分割。 - David Wolever
这是我迄今为止找到的最佳解决方案。干得好! - Cyril

1

自2008年11月起,从如何在Python中将列表均匀分成多个部分?复制答案:

直接从Python文档(itertools的配方)中获取:

from itertools import izip, chain, repeat

def grouper(n, iterable, padvalue=None):
    "grouper(3, 'abcdefg', 'x') --> ('a','b','c'), ('d','e','f'), ('g','x','x')"
    return izip(*[chain(iterable, repeat(padvalue, n-1))]*n)

根据J.F.Sebastian的建议,另一种看法:

from itertools import izip_longest

def grouper(n, iterable, padvalue=None):
    "grouper(3, 'abcdefg', 'x') --> ('a','b','c'), ('d','e','f'), ('g','x','x')"
    return izip_longest(*[iter(iterable)]*n, fillvalue=padvalue)

我猜Guido的时间机器能够工作-过去工作-将要工作-将会工作-正在再次工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接