字串操作
字串在任何一門語言都是一個重點,靈活運用可實現各種強大的功能,在python中,字串也是如此,標準的序列操作對字串也使用,但是分區賦值不行,因為字串是不可變的。
字串的格式化:
字串格式化使用字串格式化操作符%來實現,在%左側放置一個字串,右側放置希望格式化的值。看下面這個簡單的例子:
>>> format="Hello,%s,I'm studying %s!">>> values=('world','Python')>>> print format % valuesHello,world,I'm studying Python!
注意:如果使用列表或者其他列表代替元組,那麼序列就會被解釋為一個值,只有元組和字典和格式化一個以上的值。
%s標記了需要插入轉換值的位置,s表示會被轉化為字串,如果不是字串,則會用str將其轉換為字串。另外,如果需要在格式化字串裡包括百分比符號,則必須使用%%。
如果需要格式化實數,用f說明符類型,同時提供精度;一個據點再加上希望儲存的小數位元。因為格式化說明符總是以表示類型的字元結束,所以精度應該放在類型字元前面:
>>> format="PI with three decimals :%.3f">>> from math import pi>>> print format % piPI 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=10item_width=width-price_widthheader_format='%-*s%*s'format ='%-*s%*.2f'print '=' * widthprint header_format % (item_width,'Item',price_width ,'Price')print '-' * widthprint 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 '=' * widthraw_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'
字串的方法有很多,以上這些是比較常用的,可以用到時再去查。