如何用Python将连续字符串拆分为组件?
这跟我想做的事情很像:把一个32位的数字拆分成单独的部分
这是我常见的“字符串”:00000000110000000000011000000000
我需要把它分成四个相等的部分:
00000000
11000000
00000110
00000000
我还需要把这些部分加到一个新的文本文件里,并把原始字符串作为标题。
我知道如果字符串中有空格这样的分隔符,我可以怎么拆分,但我的字符串是连续的,没有分隔。
这些可以看作是32位和8位的二进制数字,但现在它们只是文本文件里的文本!
我刚开始学习Python编程,所以请给我详细的步骤,不要泛泛而谈。
不要假设我懂任何东西。
谢谢,
拉尔夫
5 个回答
这里有几种方法可以把字符串分成相等长度的部分,供你参考:
>>> import re
>>> re.findall(r'.{1,8}', s, re.S)
['00000000', '11000000', '00000110', '00000000']
>>> map(''.join, zip(*[iter(s)]*8))
['00000000', '11000000', '00000110', '00000000']
关于如何用 zip
方法把一串东西分成n个长度的小组,可以在这里找到详细说明。不过要注意,这个方法只适用于长度能被n整除的字符串(这对这个问题来说不是个大问题)。如果字符串的长度不能被n整除,你可以使用 itertools.izip_longest(*[iter(s)]*8, fillvalue='')
这个方法。
对罗伯特的回答表示赞同。关于“我需要把列表追加到一个新文本文件中,并把原始字符串作为标题”的问题:
s = "00000000110000000000011000000000"
s += '\n' + '\n'.join(s[i:i+8] for i in xrange(0, len(s), 8))
这样做会得到
'00000000110000000000011000000000\n00000000\n11000000\n00000110\n00000000'
这样每个“字节”就会在单独的一行上,正如我从你的问题中理解的那样……
编辑:一些帮助你理解的说明:
一个列表 []
(可以在 这里查看)包含了你的数据,在这个例子中是字符串,数据放在方括号之间。列表中的第一个项目可以这样获取:
mylist[0]
在Python中,字符串本身也是一个对象,有一些特定的方法可以调用。所以 '\n'
(表示换行)是一个类型为“字符串”的对象,你可以用你的列表作为参数调用它的方法 join()
:
'\n'.join(mylist)
列表中的元素会用字符串 '\n'
连接在一起,每个元素之间都有这个换行符。结果不再是一个列表,而是一个字符串。两个字符串可以相加,因此
s += '\n' + '\n'.join(mylist)
会把 s
(已经是一个字符串)和右边的部分(它本身是字符串的“和”)相加。
(希望这样能让你明白一些事情?)
这段代码应该能满足你的需求。想了解更多细节,可以查看这个链接,里面讲了关于列表推导式的内容。
>>> s = "00000000110000000000011000000000"
>>> [s[i:i+8] for i in xrange(0, len(s), 8)]
['00000000', '11000000', '00000110', '00000000']