字符串提供了一系列的方法去实现复杂的文本处理任务。方法就是与特定的对象关联在一起的函数。方法调用同时进行了两次操作:
第一次:属性读取——具有object.attribute格式的表达式可以理解为“读取object对象的属性attribute的值”;
第二次:函数调用表达式——具有函数(参数)格式的表达式意味着“调用函数代码,传递零或者更多用逗号隔开的参数对象,最后返回函数的返回值”。
方法调用表达式对象,方法(参数)从左至右运行,也就是说Python首先读取对象方法,然后调用它,传递参数。如果一个方法计算出一个结果,它将会作为整个方法调用表达式的结果被返回。
这里,着重介绍这样几个方法:find、join、replace、split。
1、find方法:
使用方法: S.find( sub, [ , start, [ , end]])
注:对于上面使用格式的说明:[]表示参数可选,未用此[]包含的参数为必须指定的参数。
find方法返回在子字符串出现处的偏移(默认从前向后开始搜索)或者未找到时返回-1。
>>> s = 'xxxxspamxxxxspamxxxx' >>> where = s.find('spam') >>> where 4
现在,如果我们试图去实现这样一个替换操作:将s字符串的spam字符串替换为eggs。
首先,如果仅仅是替换第一个spam,那么可以这样操作:
>>> s1 = s[:where] + 'eggs' + s[(where+4):] >>> s1 'xxxxeggsxxxxspamxxxx' >>>
但是假如我们希望完全替换所有的spam为eggs,那么,我们有如下的代码更改:
>>> s = 'xxxxspamxxxxspamxxxx' >>> where = s.find('spam') >>> while where != -1 : ... s = s[:where] + 'eggs' + s[(where+4):] ... where = s.find('spam') ... >>> s 'xxxxeggsxxxxeggsxxxx' >>>
这样的效率很低,代码量也很大,因此,我们可以使用replace方法:
2、replace方法:
使用方法:S.replace(old, new, [, maxsplit])
该方法的第一个参数是原始子字符串(任意长度),替换原始子字符串的字符串(任意长度),之后进行全局搜索并替换。
>>> s = 'xxxxspamxxxxspamxxxx' >>> s.replace('spam', 'eggs') 'xxxxeggsxxxxeggsxxxx' >>> s 'xxxxspamxxxxspamxxxx' >>>
在这里,有几个点需要说明:
(1)replace方法每次返回的字符串是一个新的字符串对象。由于字符串是不可变的,因此,每一种方法并不是真正在原处修改了字符串。
(2)我们可以通过控制第三个变量来实现只替换一次的目的:
>>> s.replace('spam', 'eggs', 1) 'xxxxeggsxxxxspamxxxx' >>>
3、join方法:
使用方法:S.join(seq)
join方法常常将字符串列表合并成一个字符串。
>>> s = 'spamy' >>> l = list(s) >>> l ['s', 'p', 'a', 'm', 'y'] >>> s 'spamy' >>>
如上所示,list可以将字符串分割成单字符列表,但是原字符串并未修改。join负责将列表字符合并成一个字符串。
>>> l ['s', 'p', 'a', 'm', 'y'] >>> s 'spamy' >>> ''.join(l) 'spamy' >>> '+'.join(l) 's+p+a+m+y' >>> t = '***' >>> t.join(l) 's***p***a***m***y' >>>
从这里,我们可以得出这样几个结论:
(1)join会将调用该方法的字符串(我们称之为分隔符)插入至合并字符串;
>>> '%'.join(['d','s','ld','f']) 'd%s%ld%f'
(2)通过上面的join实例,我们可以看出:分隔符的个数始终等于列表元素个数-1。
(3)合并后的字符串会存储在内存中,而不会修改列表对象。
4、split方法:
使用方法:S.split([seq, [, maxsplit]])
split方法分割字符串并将子字符串存储在列表(list)对象中。
>>> x = 'iperf -u -c 192.168.1.1' >>> x.split() ['iperf', '-u', '-c', '192.168.1.1'] >>> x = 'iperf -u -c 192.168.1.1' >>> x.split() ['iperf', '-u', '-c', '192.168.1.1'] >>>
上面是split函数的默认使用情景,通过这些实例,我们可以看出,split默认方法的作用是以空格将字符串分割开来,而不管空格数是多少个(大于等于1个)。当然,通过上面的实例,我们可以看出,split默认方法常常用作命令行分析工具。
现在,对于可选参数,我们进行相关分析:
>>> s = 'www.baidu.com' >>> s.split() ['www.baidu.com'] >>> s.split(',') ['www.baidu.com'] >>> s.split('.') ['www', 'baidu', 'com']
通过上面的代码,可选参数即为指定分隔符,用以将字符串分割的标志。另外,split默认方法是不能分离无空格字符串的。
现在,我们进行另一种尝试:
>>> s = r'www.baidu.com/zhidao/cpp/format/2015-1-5-22-10' >>> s 'www.baidu.com/zhidao/cpp/format/2015-1-5-22-10' >>> s.split() ['www.baidu.com/zhidao/cpp/format/2015-1-5-22-10'] >>> s.split('.') ['www', 'baidu', 'com/zhidao/cpp/format/2015-1-5-22-10'] >>> s.split(r'/') ['www.baidu.com', 'zhidao', 'cpp', 'format', '2015-1-5-22-10'] >>> s.split('-') ['www.baidu.com/zhidao/cpp/format/2015', '1', '5', '22', '10'] >>> s.split(['.','//','-']) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: expected a character buffer object
对于上面的一个具有多个有意义分隔符的字符串时,我们如果试图同时获取所希望的数据,那么,通过在可选参数中设定list对象,是不行的。
很多时候,要得到多个分隔符分割的结果,使用正则表达式无疑是更好的选择。