几个Python字符串方法浅析


字符串提供了一系列的方法去实现复杂的文本处理任务。方法就是与特定的对象关联在一起的函数。方法调用同时进行了两次操作:

第一次:属性读取——具有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 "", line 1, in 
TypeError: expected a character buffer object

对于上面的一个具有多个有意义分隔符的字符串时,我们如果试图同时获取所希望的数据,那么,通过在可选参数中设定list对象,是不行的。

很多时候,要得到多个分隔符分割的结果,使用正则表达式无疑是更好的选择。


评论关闭