字符串操作
字符串在任何一门语言都是一个重点,灵活运用可实现各种强大的功能,在python中,字符串也是如此,标准的序列操作对字符串也使用,但是分片赋值不行,因为字符串是不可变的。
字符串的格式化:
字符串格式化使用字符串格式化操作符%来实现,在%左侧放置一个字符串,右侧放置希望格式化的值。看下面这个简单的例子:
>>> format="Hello,%s,I'm studying %s!"
>>> values=('world','Python')
>>> print format % values
Hello,world,I'm studying Python!
注意:如果使用列表或者其他列表代替元组,那么序列就会被解释为一个值,只有元组和字典和格式化一个以上的值。
%s标记了需要插入转换值的位置,s表示会被转化为字符串,如果不是字符串,则会用str将其转换为字符串。另外,如果需要在格式化字符串里包括百分号,则必须使用%%。
如果需要格式化实数,用f说明符类型,同时提供精度;一个据点再加上希望保存的小数位数。因为格式化说明符总是以表示类型的字符结束,所以精度应该放在类型字符前面:
>>> format="PI with three decimals :%.3f"
>>> from math import pi
>>> print format % pi
PI with three decimals :3.142
格式化操作符的右操作数可以是任何东西,如果是元组或者映射类型(字典),则字符串的格式化略有不同。例如,如果右操作数是元组,则其中每一个I元素都会被单独格式化,每个值都需要一个对应的转换说明符。(注意:如果需要转换的元组作为转换表示的一部分存在,那么必须将它用圆括号括起来)
>>> '%s plus %s equals %s ' %(1,1,2)
'1 plus 1 equals 2 '
当然,字符串格式化还有很多,比如填充和字宽和精度等,这些带用到时再去查也不迟,下面是一个关于字符串格式化一个较综合的例子,包括字宽和对齐等:
width = input ( 'Please input width:' ) price_width = 10 item_width = width - price_width header_format = '%-*s%*s' format = '%-*s%*.2f' print '=' * width print header_format % (item_width, 'Item' ,price_width , 'Price' ) print '-' * width print format % (item_width , 'Apples' ,price_width , 0.4 ) print format % (item_width , 'Pears' ,price_width , 0.5 ) print format % (item_width , 'Cantaloupes' ,price_width , 1.92 ) print format % (item_width , 'Dried Apricots(16 oz.)' ,price_width , 8 ) print format % (item_width , 'Prunes(4 lbs.)' ,price_width , 12 ) print '=' * width raw_input ( "enter any key to exit~~" ) |
运行结果如下:
字符串方法:
几乎任何一种语言关于字符串的方法都很多,不过都大同小异,python中字符串方法的思想和数据结构的思想非常相似。
find——在一个较长的字符串查找子字符串,返回所在位置的最左端索引,下面是常用的用法:
>>> "hello,python,I like python" .find( 'python' ) #返回的是第一个‘python’的索引 6 >>> title = "hahha,hekko,hello" >>> title.find ( 'find' ) #找不到时返回-1 - 1 >>> subject = '$$$ Get rich now !!!$$$' >>> subject.find ( '$$$' ) #默认返回最左边所在的位置 0 >>> subject.find ( '$$$' , 1 ) #指定起始搜索位置 20 >>> subject.find( '$$$' , 0 , 10 ) #指定搜索的上下限,注意包含上线不包含下线 0 |
join——用来在队列中添加元素(必须是字符串),是split方法的逆方法,很常用,下面几例是常见用法:
>>> digitals = [ 1 , 2 , 3 , 4 , 5 ] >>> seperaor = '+' >>> seperaor.join(digitals) #连接数字列表出现错误 Traceback (most recent call last): File "<pyshell#9>" , line 1 , in <module> seperaor.join(digitals) TypeError: sequence item 0 : expected string, int found >>> digitals = [ '1' , '2' , '3' , '4' , '5' ] #改为字符串 >>> seperaor = '+' >>> seperaor.join(digitals) #连接字符串列表是正确的 '1+2+3+4+5' >>> dir = ' ',' usr ',' bin ',' env' >>> '/' .join( dir ) #Linux下目录的格式 '/usr/bin/env' >>> print 'C:' + '\\' .join( dir ) #windows下目录格式,注意反斜杠需要转义 C:\usr\ bin \env |
lower——返回字符串的小写字母。为了程序的友好有时候需要“忽略”用户输入的大小写,在程序中应使用统一的格式来识别,下面举出常见用法:(upper是类似的用法)
>>> 'Trouble Is a Friend!' .lower() 'trouble is a friend!' >>> if 'Jzhou' in [ 'jason' , 'james' , 'jzhou' ]: #未转换时没有匹配 print 'Found it!' >>> name = 'Jzhou' >>> names = [ 'jason' , 'james' , 'jzhou' ] >>> if name.lower() in names: #将转换为小写进行匹配 print 'Found it!' Found it! >>> |
title方法和string模块的capwords函数可以将一句话的首字母大写,符合标题习惯(对冠词的处理不太合理)
>>> 'i like python' .title () 'I Like Python' >>> import string >>> string.capwords ( "i like python!" ) 'I Like Python!' >>> |
replace——返回字符串的所有匹配项均被替换之后得到的字符串
>>> 'this is a test' .replace( 'test' , 'work' ) 'this is a work' #查找并替换 |
split——将字符串分割成序列,是join的逆方法,很常用
>>> '1+2+3+4+5' .split( '+' ) [ '1' , '2' , '3' , '4' , '5' ] >>> '/usr/bin/env' .split( '/' ) [' ', ' usr ', ' bin ', ' env'] >>> 'Using the default' .split () #如果不提供任何分隔符,默认会把所有空格(包括空格、制表符、换行符等)作为分隔符 [ 'Using' , 'the' , 'default' ] |
strip(lstrip,rstrip)——返回出去两侧(不包括内部)空格的字符串,类似C#中的trim函数(ltrim,rtrim)
>>> ' internal whtiespace is kept ' .strip () 'internal whtiespace is kept' #默认取出前后的空格 >>> names = [ 'jason' , 'james' , 'jzhou' ] >>> name = ' jzhou' #前面有2个空格 >>> if name in names : print 'Found it!' #不匹配 >>> if name.strip() in names : print 'Found it!' #取出空格后匹配 Found it! >>> '****!!SPAM** for ** everyone!!*******' .strip( '*!' ) #指定要去除的字符 'SPAM** for ** everyone' >>> |
translate——和replace方法一样,可以替换字符串中的某些部分,但是和replace不同,它只处理单个字符,但同时可进行多个替换,有时效率比replace高。
使用translate转换之前,需要先完成一张转换表,转换表中是以某字符的对应关系,这个表有多达256个项目,可以使用string模块里的maketrans函数得到。
maketrans函数有两个参数:两个等长的字符串,表示第一个字符串中的每个字符都用第二个字符串中相同位置的字符替换,如下例子:
>>> from string import maketrans >>> table = maketrans( 'cs' , 'kz' ) #就是把table中的字符c换成k,字符s换成z >>> len (table) 256 >>> table[ 97 : 123 ] #提取处理后的小写字母部分,字符c和s已经被替换了 'abkdefghijklmnopqrztuvwxyz' >>> maketrans (' ',' ')[ 97 : 123 ] #这是空转换(即未转换前)的消息字母部分 'abcdefghijklmnopqrstuvwxyz' >>> |
创建了这个table之后,可以将它用作translate方法的参数,进行字符串的转换,如下:
>>> 'this is an incredibele test' .translate(table) 'thiz iz an inkredibele tezt' |
translate的第二个参数是可选的,这个参数用来指定要删除的字符,如将一句话中‘fuck’删除:
>>> 'Hen,fuck is not a good word' .translate(table, 'fuck' ) 'Hen, iz not a good word' >>> 'Hen,fuck is not a good word' .translate(table, ' ' ) #将空格都删除 'Hen,fukkiznotagoodword' |
字符串的方法有很多,以上这些是比较常用的,可以用到时再去查。