几个Python字符串方法浅析

来源:互联网 发布:批发软件 编辑:程序博客网 时间:2024/06/14 00:06

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

第一次:属性读取——具有object.attribute格式的表达式可以理解为“读取object对象的属性attribute的值”;

第二次:函数调用表达式——具有函数(参数)格式的表达式意味着“调用函数代码,传递零或者更多用逗号隔开的参数对象,最后返回函数的返回值”。

方法调用表达式对象,方法(参数)从左至右运行,也就是说Python首先读取对象方法,然后调用它,传递参数。如果一个方法计算出一个结果,它将会作为整个方法调用表达式的结果被返回。

这里,着重介绍这样几个方法:find、join、replace、split。

1、find方法:

使用方法: S.find( sub, [ , start, [ , end]])

注:对于上面使用格式的说明:[]表示参数可选,未用此[]包含的参数为必须指定的参数。

find方法返回在子字符串出现处的偏移(默认从前向后开始搜索)或者未找到时返回-1。

>>> s = 'xxxxspamxxxxspamxxxx'>>> where = s.find('spam')>>> where4

现在,如果我们试图去实现这样一个替换操作:将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对象,是不行的。

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


0 0
原创粉丝点击