第三章 使用字符串
第三章 使用字符串
前面已經學過了如何使用索引和切片來訪問字符串中的字符。本章將介紹如何使用字符串來設置其他值的格式(比如便於打印),並大致了解使用字符串的方法可完成的任務,如拆分、合並和查找等
3.1 字符串基本操作
所有標準序列操作(索引、切片、乘法、成員檢查資格、長度、最小值和最大值)都適用於字符串,但別忘了了字符串是不可變的,因此所有的元素賦值和切片賦值都是非法的。
>>>website = ‘http://www.python.org‘
>>>website[-3:]=‘com‘
Traceback (most recent call last):
...............................
...............................
接下來就是報錯,報錯內容省略,可以自己去嘗試一下。
3.2設置字符串的格式:精簡版
如果你是新手,那麽介紹以下內容就夠大家使用了。
將值轉換成字符串並設置其格式是一個重要的操作,需要考慮到眾多不同的需求,因此隨著時間的流逝,Python提供了許多字符串格式設置方法。以前,主要的解決方案是使用字符串格式運算符------百分號。這個運算符的行為類似於C語言的經典函數printf:在%左邊指定一個字符串(格式字符串),並在右邊指定要設置其格式的值。指定的設置其格式的值時,可使用單個值(如字符串或者數字),可使用元組(如果要設置多個值的格式),還可使用字典(將在下一張討論),其中最常見的是元組。
>>>format="Hello,%s.%s enough for ya?
>>>values=(‘world‘,‘Hot‘)
>>>format % values
‘Hello,world.Hot enough for ya?‘
上述的格式字符串中的%稱為轉換說明符,其他說明符將導致其他字符串的轉換。例如,%.3f將值的格式設置為包含3位小數的浮點數。
編寫新代碼的時候,我們應該使用字符串方法format,它融合並強化了早期方法的優點。使用這種方法時,每個替換字段用花括號括起來,其中可能包含名稱,還可能包含有關如何對相應的值進行轉換和格式設置的信息。
在最簡單的情況下,替換字段沒有名稱或者將索引用作名稱。
>>>"{},{} and {}",format("first","second","third")
‘first,second and third‘
>>>"{0},{1} and{2}".format("first","second","third")
’first,second and third‘
然而,索引無需像上面這樣按排序排列
>>>"{3} {0} {2} {1} {3} {0}".format("be","not","or","to")
"to be ot not to be"
命名字段的工作原理與你預期的完全一樣
>>>from math import pi
>>>“{name} is approximately {value:.2f}.".format(value=pi,name="Π“)
”Π is approximately 3.14“
當然,此時關鍵字的排序不是非常重要,format括號內的內容可以隨便放。
最後,在python中,如果變量於替換字段同名,還可使用一種簡寫。在這種情況下,使用f字符串------在字符串前面加f
>>>from math import e
>>>f"Euler‘s constant is roughly {e}."
"Euler‘s constant is roughly 2.71818......."
在這裏,創建最終的字符串時,將把替換字段e替換為變量e的值,這裏與下面的表達式等價:
>>>"Euler‘s constant is roughly {e}.".format(e=e)
"Euler‘s constant is roughly 2.71828............"
3.4字符串方法
3.4.1 center
方法center通過在兩邊添加填充字符(默認為空格)讓字符串居中。
>>>"The Midde by a Jimmy Eat World".center(39)
‘ The Middle by Jimmy Eat World ‘
>>>"The Middle by a Jimmy Eat World".center(39,‘*‘)
‘*****The Middle by a Jimmy Eat World*****‘
3.4.2 find
方法find在字符串中查找字串。如果找到,就返回字串的第一個字符的索引,否則返回-1。
>>>‘With a moo-moo here,and a moo-moo there‘.find(‘moo‘)
7
>>>title = "Monty Python‘s Fiying Circus"
>>>title.find(‘Monty‘)
0
>>>title.find(‘Zirquss‘)
-1
第二章部分的初識成員資格時,我們在垃圾郵件過濾器中檢查主題是否包含’$$$‘。這種檢查可使用find來執行,也可使用in來代替。
>>>subject=‘$$$ Get rich now!!! $$$‘
>>>subject.find(‘$$$‘)
0
註意:字符串方法find返回的並非布爾值。如果find像這樣返回0,這意味著它在索引0處找到了指定的字串。
你同樣可以指定搜索的起點和終點(它們都是可選的)。
>>> subject=‘$$$ Get rich now!!! $$$‘
>>>subject.find(‘$$$‘)
0
>>>subject.find(‘$$$‘,1)#只是指定了起點
20
>>>subject.find(‘!!!‘)
16
>>>subject.find(‘!!!‘,0,16) #同時指定了起點和終點
-1
請註意,起點和終點(第二參數和第三參數)指定的搜索範圍包含起點,但不包含終點,這是Python慣用的做法。
3.4.3 join
join是一個非常重要的字符串方法,其作用於split相反,用於合並序列的元素。
>>>seq=[1,2,3,4,5]
>>>sep=‘+‘
>>>sep.join(seq)#嘗試合並一個數字列表
Trackback (most recent call last):
..................................................
..................................................(此處報錯)
>>>seq=[‘1‘,‘2‘,‘3‘,‘4‘,‘5‘]
>>>sep.join(seq)
‘1+2+3+4+5‘
>>>dirs= ‘ ‘,‘usr‘,‘bin‘,‘env‘
>>>‘\‘.join(dirs)
‘ /usr/bin/env‘
>>>print(‘C:‘+‘\\‘.join(dirs))
C: \usr\bin\env
註意:第二個例子此處用到了轉義
3.4.4 lower
方法lower返回字符串的小寫版本
>>>‘Trondheim Hammer Dance‘.lower()
‘trondheim hammer dance‘
如果不想區分字符串的大小寫(即忽略大小寫差別),很有用的。例如,假設你要檢查列表中是否包含指定的用戶名。如果列表包含字符串’gumby‘,而指定的用戶名為‘Gumby‘,你找不到它。
>>>if ‘Gumby‘ in[‘gumby‘,smith‘,‘jones‘]:print(‘Fount it!‘)
....
>>>
這樣當然查找不到,但如果將其轉化成小寫。這樣做代碼類似於下面:
>>>name=‘Gumby‘
>>>names=[‘gumby‘,‘smith‘,‘jones‘]
>>>if name.lower() in names:print(‘Fount it!‘)
.....
Fount it!
>>>
3.4.5 replace
方法replace將指定子串都替換為另一個字符串,並返回置換後的結果。
>>>‘This is a test‘.replace(‘is‘,‘eez‘)
‘Theez eez a test‘
如果你使用過字處理程序的“查找並替換”功能,一定知道這個方法有用。
3.4.6 strip
方法strip將字符串開頭和末尾留空白(但不包括中間的空白)刪除,並返回刪除後的結果。
>>>‘ abc def ‘.strip()
‘abc def‘
與lower一樣,需要將輸入與存儲的值進行比較時,strip很有用。回到前面介紹lower時使用的用戶名示例,並假定用戶輸入用戶名的時候末尾加上了一個空格。
>>>names=[‘gumby‘,‘smith‘,‘joins‘]
>>>name = ‘gumby ‘
>>>if name in names:print(‘Found it !")
...
>>>if name.strip() in names:print(‘Found it!‘)
...
Found it!
>>>
你也可以在一個字符串參數中指定刪除哪些字符。
>>>‘*** SPAM * for * everyone!!! ***’。lower(‘ *!’)
‘SPAM*for*everyone‘
這個方法只刪除開頭或者末尾的指定字符,因此中間的星號未被刪除。
3.4.8 translate
方法translate與replace一樣替換字符串的特定部分,但不同的地方在於它只能進行單字符替換。這個方法的優勢在於能夠同時替換多個字符串。因此比replace的效率高。
註意,使用translate必須提前創建一個轉換表,可對字符串類型str調用函數maketrans,這個方法接受兩個參數:兩個長度相同的字符串,它們指定要將第一個字符串中的每個字符串都替換成第二個字符串中相應的字符
舉例:
>>>table=str.maketrans(‘cs‘,‘ke‘)
如果願意,可查看轉換表的內容,你可看到的只是Unicode碼點之間的映射。
>>>table
{115:122,99:107}
創建轉換表後,就可將其用做方法translate的參數。
>>>‘this is an incredible test‘.translate(table)
thiz iz an inkredible tezt‘
調用方法maketrans時,還可提供可選的第三個參數,指定要將那些字母刪除。例如,要將模仿語速極快的德國口音,可將所有的空格刪除。
>>>table=str.maketrans(‘cs‘,‘ke‘,‘ ‘)
>>>‘this is an incredible test‘.translate(table)
‘thizizankredibletezt‘
3.4.9 判斷字符串是否滿足特定的條件
很多字符串方法以is打頭,如isspace、isdigit和issupper,它判斷字符串是否具有特定的性質(如包含的字符全為空白、數字或者大寫)。如果字符串具備特定的性質,這些方法就是True,否則返回False。
第三章 使用字符串