Python recipe(4):Substrings
代码先行:
![div css xhtml xml Example Source Code](https://images.cnblogs.com/cnblogs_com/suyuan/quote.gif)
''' Created on 2010-5-20 @author: lk ''' import struct def substrings1(str, cuts): return [str[i:j] for i,j in zip([0]+cuts, cuts)] def substrings2(str, fmt): numer_rest = len(str)-struct.calcsize(fmt) format = "%s %dx"%(fmt, numer_rest) return struct.unpack(format, str) if __name__ == '__main__': str = 'Hello, my name is Kang Liu, and my major is SE' cuts = [2,4,12,20,100] print substrings1(str, cuts) str2 = "Name:TomxxxAge:22 Foo!Foo!Foo!" fmt = "4s 1x 3s 3x 6s" print substrings2(str2, fmt)
以上代码改写自Python Cookbook 3-11
概述:
给出两种取子字符串的方法:第一种比较naive,依赖下标做slicing;第二种借助python内建struct模块解析字符串
代码说明:
1. 第一种方法中有一个trick,zip([0]+cuts, cuts) 使得相邻下标两两组成tuple
2. struct模块用来将python类型解析为二进制(可看作字符流),或者反过来。这里使用的主要是struct.unpack函数,即从字符流解析出python类型。这里首先给出一个模板’4s 1x 3s 3x 6s’, s表示字符串,x表示无意义填充,所以该模板意为“4字符,后跟1填充,后跟3字符,后跟3填充,后跟6字符”,3. struct.calcsize函数计算一个模板匹配后的长度,如上述模板计算后长度应为17。
更多struct模块使用方法可见python手册,这里有一篇网文也可参考:
Python模块学习 ---- struct 数据格式转换