第5章 字元串及正則表達式 5.1 字元串常用操作 在Python開發過程中,為了實現某項功能,經常需要對某些字元串進行特殊處理,如拼接字元串、截取字元串、格式化字元串等。下麵將對Python中常用的字元串操作方法進行介紹。 5.1.1 拼接字元串 使用“+” 運算符可完成對多個字元串的拼接,“+” ...
第5章 字元串及正則表達式
5.1 字元串常用操作
在Python開發過程中,為了實現某項功能,經常需要對某些字元串進行特殊處理,如拼接字元串、截取字元串、格式化字元串等。下麵將對Python中常用的字元串操作方法進行介紹。
5.1.1 拼接字元串
使用“+” 運算符可完成對多個字元串的拼接,“+” 運算符可以連接多個字元串並產生一個字元串對象。
例如,定義兩個字元串,一個保存英文版的名言,另一個用於保存中文版的名言,然後使用“+” 運算符連接,代碼如下:
mot_en = 'Remembrance is a form of meeting. Forgetfulness is a form of freedom.' mot_cn = '記憶是一種相遇。遺忘是一種自由。' print(mot_en + '——' + mot_cn)
上面的代碼執行後,將顯示以下內容:
Remembrance is a form of meeting. Forgetfulness is a form of freedom.——記憶是一種相遇。遺忘是一種自由。
字元串不允許直接與其他類型的數據拼接,例如,使用下麵的代碼將字元串與數值拼接在一起,將產生如下異常。
str1 = '我今天一共走了' # 定義字元串 num = 2456 # 定義一個整數 str2 = '步' # 定義字元串 print(str1 + num + str2) # 對字元串和整數進行拼接
Traceback (most recent call last): File "D:\python3.6.5\練習文件\demo.py", line 532, in <module> print(str1 + num + str2) # 對字元串和整數進行拼接 TypeError: must be str, not int >>>
解決該問題,可以將整數轉換為字元串,然後以拼接字元串的方法輸出該內容。將整數轉換為字元串,可以使用str() 函數,修改後的代碼如下:
str1 = '我今天一共走了' # 定義字元串 num = 2456 # 定義一個整數 str2 = '步' # 定義字元串 print(str1 + str(num) + str2) # 對字元串和整數進行拼接
上面代碼執行後,將顯示以下內容:
我今天一共走了2456步
場景模擬:一天,兩名程式員坐在一起聊天,於是產生了下麵的笑話:程式員甲認為程式開發枯燥而辛苦,想換行,詢問程式員乙該怎麼辦。而程式員乙讓其敲一下回車鍵。試著用程式輸出這一笑話。
實例01:使用字元串拼接輸出一個關於程式員的笑話
創建一個文件,在該文件中定義兩個字元串變數,分別記錄兩面程式員說的話,再將兩個字元串拼接到一起,並且在中間拼接一個轉義字元串(換行符),最後輸出,代碼如下:
programmer_1 = '程式員甲:搞IT太辛苦了,我想換行……怎麼辦?' programmer_2 = '程式員乙:敲一下回車鍵' print(programmer_1 + '\n' + programmer_2)
運行結果如下:
程式員甲:搞IT太辛苦了,我想換行……怎麼辦?
程式員乙:敲一下回車鍵
5.1.2 計算字元串的長度
由於不同的字元所占位元組數不用,所以要計算字元串的長度,需要先瞭解各字元所占的位元組數。在Python 中,數字、英語、小數點、下劃線和空格占一個位元組;一個漢字可能會占2~4個位元組,占幾個位元組
取決於採用的編碼。漢字在GBK/GB2312 編碼中占2 個位元組,在UTF-8/unicode 編碼中一般占用3 個位元組(或4 個位元組)。下麵以Python 預設的UTF-8 編碼為例進行說明,即一個漢字占3 個位元組。
在Python 中,提供了len() 函數計算字元串的長度,語法格式如下:
len(string)
其中,string 用於指定要進行長度統計的字元串。例如,定義一個字元串,內容為“人生苦短,我用Python!”,然後應用len() 函數計算該字元串的長度,代碼如下:
str1 = '人生苦短,我用Python!' # 定義字元串 length = len(str1) # 計算字元串的長度 print(length)
上面的代碼在執行後,將輸出結果‘14’。
從上面的結果中可以看出,在預設的情況下,通過len() 函數計算字元串的長度,不區分英文,數字和漢字,所有字元都按一個字元計算。
在實際開發時,有時需要獲取字元串實際所占的位元組數,即如果採用UTF-8 編碼,漢字占3 個位元組,採用GBK 或者GB2312 時,漢字占2 個位元組。這時,可以通過使用encode() 方法(參加5.2.1 小節)進行編碼後再進行獲取。例如,如果獲取採用UTF-8 編碼的字元串的長度,可以使用下麵的代碼:
str1 = '人生苦短,我用Python!' # 定義字元串 length = len(str1.encode ()) # 計算UTF-8編碼的字元串的長度 print(length)
……
如果要獲取採用GBK 編碼的字元串的長度,可以使用下麵的代碼。
str1 = '人生苦短,我用Python!' # 定義字元串 length = len(str1.encode ('gbk')) # 計算UTF-8編碼的字元串的長度 print(length)
5.1.3 截取字元串
由於字元串也屬於序列,所以要截取字元串,可以採用切片方法實現。通過切片方法截取字元串的語法格式如下:
string[start:end:step]
參數說明:
- string:表示要截取的字元串。
- start:表示要截取的第一個字元的索引(包括該字元),如果不指定,則預設為0。
- end:表示要截取的最後一個字元的索引(不包括該字元),如果不指定則預設字元串的長度。
- step:表示切片的步長,如果省略,則預設為1,當省略該步長時,最後一個冒號也可以省略。
說明:字元串的索引同序列的索引是一樣的,也是從0 開始,並且每個字元占一個位置。
例如,定義一個字元串,然後應用切片方法截取不同長度的字元串,並輸出,代碼如下:
str1 = '人生苦短,我用Python!' # 定義字元串 substr1 = str1[1] # 截取第2個字元 substr2 = str1[5:] # 從第6個字元截取 substr3 = str1[:5] # 從左邊開始截取第5個字元 substr4 = str1[2:5] # 截取第3個到第5個字元 print('原字元串:',str1) print(substr1 + '\n' + substr2 + '\n' + substr3 + '\n' + substr4)
上面的代碼執行後,將顯示以下內容:
原字元串: 人生苦短,我用Python!
生
我用Python!
人生苦短,
苦短,
……
實例02:截取身份證號碼的出生日期
……截取出初設是哪個日期,並組合成YYYY年MM月DD日“”格式的字元串,最後輸出截取到的出生日期和生日,代碼如下:
programer_1 = '你知道我的生日嗎?' # 程式員甲問程式員乙的臺詞 print('程式員甲說:',programer_1) # 輸出程式員甲的臺詞 programer_2 = '輸入你的身份證號碼。' # 程式員乙的臺詞 print('程式員乙說:',programer_2) # 輸出程式員乙的臺詞 idcard = '101252198501058866' # 定義保存身份證號碼的字元串 print('程式員甲說:',idcard) # 程式員甲說出身份證號碼 birthday = idcard[6:10] + '年' + idcard[10:12] + '月' + idcard[12:14] + '日' # 截取生日 print('程式員乙說:','你是' + birthday + '出生的,所以你的生日是' + birthday[5:])
運行結果如下:
程式員甲說: 你知道我的生日嗎? 程式員乙說: 輸入你的身份證號碼。 程式員甲說: 101252198501058866 程式員乙說: 你是1985年01月05日出生的,所以你的生日是01月05日
5.1.4 分割、合併字元串
在Python 中,字元串對象提供了分割和合併字元串的方法。分割字元串是把字元串分割為列表,而合併字元串是把列表合併為字元串,分割字元串和合併字元串可以看作是互逆操作。
1. 分割字元串
字元串對象的split() 方法可以實現字元串分割,也就是把一個字元串按照指定的分隔符切分為字元串列表。該列表的元素中,不包括分隔符。split() 方法的語法格式如下:
str.split(sep,maxsplit)
參數說明:
- str:表示要進行分割的字元串。
- sep:用於指定分隔符,可以包含多個字元,預設為None,即所有空字元(包括空格、換行“\n”、製表符“\t”等)。
- maxsplit:可選參數,用於指定分割的次數,如果不指定或者為-1,則分割次數沒有限制,否則返回結果列表的元素個數,個數最多為maxsplit+1。
- 返回值:分隔後的字元串列表。
說明:在split() 方法中,如果不指定sep 參數,那麼也不能指定maxsplit 參數。
例如,定義一個保存博客園網站的字元串,然後應用split() 方法根據不同的分隔符進行分割,代碼如下:
str1 = '博 客 園 官 網 >>> www.cnblogs.com/'
print('原字元串:',str1)
list1 = str1.split() # 採用預設分隔符進行分割
list2 = str1.split('>>>') # 採用多個字元進行分割
list3 = str1.split('.') # 採用.號進行分割
list4 = str1.split(' ',4) # 採用空格進行分割,並且只分割前4個
print(str(list1) + '\n' + str(list2) + '\n' + str(list3) + '\n' + str(list4))
list5 = str1.split('>') # 採用>進行分割
print(list5)
上面的代碼在執行後,將顯示以下內容:
原字元串: 博 客 園 官 網 >>> www.cnblogs.com/
['博', '客', '園', '官', '網', '>>>', 'www.cnblogs.com/']
['博 客 園 官 網 ', ' www.cnblogs.com/']
['博 客 園 官 網 >>> www', 'cnblogs', 'com/']
['博', '客', '', '園', '官 網 >>> www.cnblogs.com/']
['博 客 園 官 網 ', '', '', ' www.cnblogs.com/']
說明:在使用split() 方法時,如果不指定參數,預設採用空白符進行分割,這是無論有幾個空格或者空白符都將作為一個分隔符進行分割。……
場景模擬:微博的@好友欄目中,輸入“@馬雲 @雷軍 @馬化騰”(好友之間用一個空格區分),同時@三個好友。
實例03:輸出被@三個好友。
在IDLE中創建一個名稱為atfriend.py 的文件,然後在該文件中定義一個字元串,內容為“@馬雲 @雷軍 @馬化騰”,然後使用split() 方法對該字元串進行分割,從而取出好友名稱,並輸出,代碼如下:
str1 ='@馬雲 @雷軍 @馬化騰' list1 = str1.split(' ') # 用空格分隔字元串 print('您@的好友有:') for item in list1: print(item[1:]) # 輸出每個好友名字時,去掉@符號
運行結果如下:
您@的好友有:
馬雲
雷軍
馬化騰
2. 合併字元串
合併字元串與拼接字元串不同,它會將多個字元串採用固定的分隔符連接在一起。例如,字元串“灰灰*木馬*小麗*萊德”,就可以看做是通過分隔符“ * ” 將['灰灰';'木馬','小麗'',萊德']列表合併為一個字元串的結果。
合併字元串可以使用字元串對象的join() 方法實現,語法格式如下:
strnew = string.join(iterable)
參數說明:
- strnew:表示合成後生成新的字元串。
- string:字元串類型,用於指定合併時的分隔符。
- iterable:可迭代對象,該迭代對象中的所有元素(字元串表示)將被合併為一個新的字元串。string 作為邊界點分割出來。
場景模擬:微博的@好友欄目中,輸入“@馬雲 @雷軍 @馬化騰”(好友之間用一個空格區分),即可同時@三個好友。現在想要@好友列表中的全部好友,所以需要組合一個類似的字元串。
實例04:通過好友列表生成全部被@的好友
在IDLE 中創建一個名稱為atfriend-join.py 的文件,然後在該文件中定義一個列表,保存一些好友名稱,然後使用 join() 方法將列表中每個元素用空格 +@ 符號進行連接,再在連接後的字元串前添加一個 @ 符號,最後輸出,代碼如下:
list_friend =['馬雲','雷軍','馬化騰','王永林','牛根生'] # 好友列表 str_friend = ' @'.join (list_friend) # 用空格+@符號進行連接 at = '@'+str_friend #由於使用join() 方法時,第一個元素前不加分隔符,所以需要在前面加上@符號 print('您要@的好友:',at) # 輸出每個好友名字時,去掉@符號
運行結果如下:
您要@的好友: @馬雲 @雷軍 @馬化騰 @王永林 @牛根生
5.1.5 檢索字元串
在Python中,字元串對象提供了很多應用於字元串查找的方法,這裡介紹以下幾種方法,這裡主要介紹以下幾種方法。
1. count() 方法
count() 方法用於檢索指定字元串在另一個字元串中出現的次數。如果檢索的字元串不存在,則返回0,否則返回出現的次數。其語法格式如下:
str.count(sub[, start[, end]])
參數說明:
- str:表示原字元串。
- sub:表示要檢索的子字元串。
- start:可選參數,表示檢索範圍的起始位置的索引,如果不指定,則從頭開始檢索。
- end:可選參數,表示檢索範圍的結束位置的索引,如果不指定,則一直檢索到結尾。
例如,定義一個字元串,然後應用count() 方法檢索該字元串“@”符號出現的次數,代碼如下:
str1 ='@馬雲 @雷軍 @馬化騰' print('字元串“',str1,'”中包括',str1.count('@'),'個@符號')
上面的代碼執行後,將顯示以下結果:
字元串“ @馬雲 @雷軍 @馬化騰 ”中包括 3 個@符號
2. find() 方法
該方法用於檢索是否包含指定的子字元串。如果檢索的字元串不存在,則返回-1,否則返迴首次出現該子字元串時的索引。其語法格式如下:
str.find(sub[, start[, end]])
參數說明:
- str:表示原字元串。
- sub:表示要檢索的子字元串。
- start:可選參數,表示檢索範圍的起始位置的索引,如果不指定,則從頭開始檢索。
- end:可選參數,表示檢索範圍的結束位置的索引,如果不指定,則一直檢索到結尾。
例如,定義一個字元串,然後應用find() 方法檢索該字元串中首次出現“@”符號的位置索引,代碼如下:
str1 ='@馬雲 @雷軍 @馬化騰' print('字元串“',str1,'”中@符號首次出現的位置索引為:',str1.find('@'))
上面的代碼執行後,將顯示以下結果:
字元串“ @馬雲 @雷軍 @馬化騰 ”中@符號首次出現的位置索引為: 0
說明:如果只是想要判斷指定的字元串是否存在,可以使用in 關鍵字實現。例如,上面的字元串str1 中是否存在@符號,可以使用print(‘@’in str1) ,如果存在就返回True,否則返回False。另外,也可以根據find() 方法的返回值是否大於-1來確定的字元串是否存在。
如果輸入的子字元串在原字元串中不存在,將返回-1。例如下麵的代碼:
str1 ='@馬雲 @雷軍 @馬化騰' print('字元串“',str1,'”中*符號首次出現的位置索引為:',str1.find('*'))
上面的代碼執行後,將顯示以下結果:
字元串“ @馬雲 @雷軍 @馬化騰 ”中*符號首次出現的位置索引為: -1
說明:Python的字元串對象還提供了rfind() 方法,其作用於find() 方法類似,只是從字元串右邊開始查找。
3. index() 方法
index() 方法同find() 方法類似,也是用於檢索是否包含指定的子字元串。只不過如果使用index() 方法,當指定的字元串不存在時會拋出異常。其語法格式如下:
str.index(sub[, star[, end]])
參數說明:
- str:表示原字元串。
- sub:表示要檢索的子字元串。
- start:可選參數,表示檢索範圍的起始位置的索引,如果不指定,則從頭開始檢索。
- end:可選參數,表示檢索範圍的結束位置的索引,如果不指定,則一直檢索到結尾。
- 例如,定義一個字元串,然後應用index() 方法檢索該字元串中首次出現“@”符號的位置索引,代碼如下:
str1 ='@馬雲 @雷軍 @馬化騰' print('字元串“',str1,'”中@符號首次出現的位置索引為:',str1.index('@'))
上面的代碼執行後,將顯示以下結果:
字元串“ @馬雲 @雷軍 @馬化騰 ”中@符號首次出現的位置索引為: 0
如果輸入的子字元串在原字元串中不存在,將會產生異常,例如下麵的代碼:
str1 ='@馬雲 @雷軍 @馬化騰' print('字元串“',str1,'”中*符號首次出現的位置索引為:',str1.index('*'))
上面的代碼執行後,將顯示如下異常:
Traceback (most recent call last): File "D:\python3.6.5\練習文件\demo.py", line 621, in <module> print('字元串“',str1,'”中*符號首次出現的位置索引為:',str1.index('*')) ValueError: substring not found
說明:Python的字元串對象還提供了rindex() 方法,其作用於index() 方法類似,只是從右邊開始查找。
4. startswith() 方法
starswith() 方法用於檢索字元串是否以指定子字元串開頭。如果是則返回True,否則返回False。該方法語法格式如下:
str.startswith(prefix[, start[, end]])
參數說明:
- str:表示原字元串。
- prefix:表示要檢索的子字元串。
- start:可選參數,表示檢索範圍的起始位置的索引,如果不指定,則從頭開始檢索。
- end:可選參數,表示檢索範圍的結束位置的索引,如果不指定,則一直檢索到結尾。
- 例如,定義一個字元串,然後應用startswith() 方法檢索該字元串中首次出現“@”符號的位置索引,代碼如下:
str1 ='@馬雲 @雷軍 @馬化騰' print('字元串“',str1,'”是否以@符號開頭,結果為:',str1.startswith('@'))
上面的代碼執行後,將顯示以下結果:
字元串“ @馬雲 @雷軍 @馬化騰 ”是否以@符號開頭,結果為: True
5. endswinth() 方法
endswinth() 方法用於檢索字元串是否以指定的子字元串結尾。如果是則返回True,否則返回False。該方法語法格式如下:
str.endswith(suffix[, start[, end]])
參數說明:
- str:表示原字元串。
- suffix:表示要檢索的子字元串。
- start:可選參數,表示檢索範圍的起始位置的索引,如果不指定,則從頭開始檢索。
- end:可選參數,表示檢索範圍的結束位置的索引,如果不指定,則一直檢索到結尾。
- 例如,定義一個字元串,然後應用endswith() 方法檢索該字元串是否以“.com”結尾,代碼如下:
str1 ='https://www.cnblogs.com' print('字元串“',str1,'”是否以.com結尾,結果為:',str1.endswith('.com'))
上面的代碼執行後,將顯示以下結果:
字元串“ https://www.cnblogs.com ”是否以.com結尾,結果為: True
5.1.6 字母的大小寫轉換
在Python中,字元串對象提供了lower() 方法和upper() 方法進行字母的大小寫轉換,即可用於將大寫字元轉換為小寫字母或者將小寫字母轉換為大寫字母。
1.lower() 方法
lower() 方法用於將字元串中的大寫字母轉換為小寫字母。如果字元串中沒有需要被轉換的字元,則將原字元串返回;否則將返回一個新的字元串,將原字元串中每個需要進行小寫轉換的字元都轉換成等價的小寫字元。字元長度與元字元長度相同。lower() 方法的語法格式如下:
str.lower()
其中,str 為要進行轉換的字元串。
例如,使用lower() 方法後,下麵定義的字元串將全部顯示為小寫字母。
str1 ='https://WWW.cnblogs.Com' print('字元串',str1) print('新字元串',str1.lower()) # 全部轉換為小寫字母輸出
2. upper() 方法
upper() 方法用於將字元串中的小寫字母轉換為大寫字母。……
str.upper()
str1 ='https://www.cnblogs.com' print('字元串',str1) print('新字元串',str1.upper()) # 全部轉換為大寫字母輸出
實例05:不區分大小寫驗證會員名是否唯一
代碼如下:
# 假設已經註冊的會員名稱保存在一個字元串中,以“|”進行分割 username_1 = '|LiaoXi|liaoxi|sy|SHENYANG|' username_2 = username_1.lower() # 將會員名稱字元串全部轉換為小寫 regname_1 = input('輸入要註冊的會員名稱:') regname_2 = '|' + regname_1.lower() + '|' # 將要註冊的會員名稱全部轉換為小寫 if regname_2 in username_2: # 判斷輸入的會員名稱是否存在 print('會員名',regname_1,'已經存在!') else: print('會員名',regname_1,'可以註冊了!')
5.1.7 去除字元串中的空格和特殊字元
用戶在輸入數據時,可能會無意中輸入多餘的空格,或在一些情況下,字元串前後不允許出現空格和特殊字元,此時就需要去除字元串中的空格和特殊字元。……
說明:這裡的特殊字元是指製表符\t、回車符\r、換行符\n等。
1. strip() 方法
strip() 方法用於去掉字元串左、右兩側的空格和特殊字元,語法格式如下:
str.strip([chars])
參數說明 :
- str:為要去除空格的字元串。
- chars:為可選參數,用於指定要去除的字元,可以指定多個。如果設置chars 為“@.”,則去除左、右兩側包括的“@” 或“.”。如果不指定chars 參數,預設將去除空格、製表符“\t”、回車符“\r”、換行符“\n”等。
例如,先定義一個字元串,首尾包括空格、製表符、換行符和回車符等,然後去除空格和這些特殊字元;再定義一個字元串,首尾包括“@” 或“.” 字元,最後去掉“@” 或“.”,代碼如下:
str1 = ' https://www.cnblogs.com \t\n\r' print('原字元串str1:' + str1 + '。') print('字元串',str1.strip() + '。') # 去除字元串首尾的空格和特殊字元 str2 = '@博客園.@.' print('原字元串str1:' + str2 + '。') print('字元串',str2.strip('@.') + '。') # 去除字元串首尾的空格和特殊字元
運行結果如下:
原字元串str1: https://www.cnblogs.com 。 字元串 https://www.cnblogs.com。 原字元串str1:@博客園.@.。 字元串 博客園。
2. Istrip() 方法
lstrip() 方法用於去掉字元串左側的空格和特殊字元,語法格式如下:
str.lstrip([chars])
參數說明:
- str:為要去除空格的字元串。
- chars:為可選參數,用於指定要去除的字元,可以指定多個。如果設置chars 為“@.”,則去除左、右兩側包括的“@” 或“.”。如果不指定chars 參數,預設將去除空格、製表符“\t”、回車符“\r”、換行符“\n”等。
……
3. rstrip() 方法
rstrip() 方法用於去掉字元串左側的空格和特殊字元,語法格式如下:
str.rstrip([chars])
參數說明:
- str:為要去除空格的字元串。
- chars:為可選參數,用於指定要去除的字元,可以指定多個。如果設置chars 為“@.”,則去除左、右兩側包括的“@” 或“.”。如果不指定chars 參數,預設將去除空格、製表符“\t”、回車符“\r”、換行符“\n”等。
……
5.1.8 格式化字元串
格式化字元串是指先制定一個模板,在這個模板中預留幾個空位,然後再根據需要填上相應的內容。這些空位需要通過制定的符號標記(也稱為占位符),而這些符號還不會顯示出來。在Python 中,格式化字元串有以下兩種方法:
1. 使用“%”操作符
在Python 中,要實現格式化字元串,可以使用“%” 操作符,語法格式如下:
'%[-][+][0][m][.n]格式化字元'%exp
參數說明:
- -:可選參數,用於指定左對齊,證書前方無符號,負數前方加負號。
- +:可選參數,用於指定右對齊,正數前方加正號,負數前方加負號。
- 0:可選參數,表示右對齊,正數前方無符號,負數前方加負號,用0填充空白處(一般與m 參數一起使用) 。
- m:可選參數,表示占有寬度。
- .n:可選參數,表示小數點後保留的位數。
- 格式化字元:用於指定類型,其值如下邊所示。
格式化字元 | 說明 | 格式化字元 | 說明 |
%s | 字元串(採用str())顯示 | %r | 字元串(採用repr()顯示) |
%c | 單個字元 | %o | 八進位整數 |
%d 或者 %i | 十進位整數 | %e | 指數(基底寫為e) |
%x | 十六進位整數 | %E | 指數(基底寫為E) |
%f 或者 %F | 浮點數 | %% | 字元% |
- exp:要轉換的項。如果要指定的項有多個,需要通過元組的形式進行指定,但不能使用列表。
例如,格式化輸出一個保存公司信息的字元串,代碼如下:
template = '編號:%09d\t公司名稱: %s \t官網:http://www.%s.com' # 定義模板 context1 = (7,'百度','baidu') # 定義要轉換的內容1 context2 = (8,'博客園','cnblogs') # 定義要轉換的內容2 print(template%context1) # 格式化輸出 print(template%context2) # 格式化輸出
上面的代碼運行後將顯示下麵效果,即按照指定模板格式輸出兩條公司信息。
編號:00007 公司名稱: 百度 官網:http://www.baidu.com
編號:00008 公司名稱: 博客園 官網:http://www.cnblogs.com
說明:由於使用% 操作符是早期Python 中提供的方法,自從Python 2.6版本開始,字元串對象提供了format() 方法對字元串進行格式化。現在一些Python 社區也推薦使用這種方法。所以建議大家重點學校format() 方法的使用。
2. 使用字元串對象的format() 方法
字元串對象提供了format() 方法用於進行字元串格式化,語法格式如下:
str.format(args)
參數說明:
- str: 用於指定字元串的顯示樣式(即模板)。
- args:用於指定要轉換的項,如果有多項,則用逗號進行分隔。
下麵重點介紹創建模板。在創建模板時,需要使用“{}”和“:”指定占位符,語法格式如下:
{[index][:[fill]align][sign][#][width][.precision][type]]}
參數說明:
- index:可選參數,用於指定要設置格式的對象在參數列表中的索引位置,索引值從0開始。如果省略,則根據值的先後順序自動分配。
- fill:可選參數,用於指定空白處填充的字元。
- align:可選參數,用於指定對齊方式(值為“<”是表示內容左對齊;值為“>”時表示內容右對齊;值為“=”時表示內容右對齊,將符合放在填充內容的最左側,且值對數字類型有效;值為“^”時表示內容居中),需要配合width一起。
- sign:可選參數,用於指定有無符號數(值為“+”表示正數加正號,負數加負號;值為“-”表示正數不變;負數加負號,值為空格表示正數加空格,負數加負號)。
- #:可選參數,對於二進位數、八進位數和十六進位數,如果加上#,表示會顯示0b/0o/0x首碼,否則不顯示首碼。
- width:可選參數,用於指定所占寬度。
- .precision:可選參數,用於指定保留的小數位數。
- type:可選參數,用於指定類型。
format() 方法中常用的格式化字元如下:
格式化 | 說明 | 格式化字元 | 說明 |
s | 對字元串類型格式化 | b | 將十進位整數自動轉換成二進位表示再格式化 |
d | 十進位整數 | o | 將十進位整數自動轉換成八進位表示再格式化 |
c | 將十進位整數自動轉換成對應的Unicode字元 | x 或者 X | 將十進位整數自動轉換成十六進位表示再格式化 |
e 或者 E | 轉換為科學計數法表示再格式化 | f 或者 F | 轉換為浮點數(預設小數點後保留6位)再格式化 |
g 或者 G | 自動在 e 和 f 或者 E 和 F 中切換 | % | 顯示百分比(預設顯示小數點後6位) |
說明:當一個模板中,出現多個占位符時,指定索引位置的規範需統一,即全部採用手動指定,或者全部採用自動。例如,定義“'我是數值:{:d},我是字元串:{1:s}'” 模板是錯誤的。
例如,定義一個保存公司信息的字元串模板,然後應用該模板輸出不同公司的信息,代碼如下:
template = '編號:{:0>9s}\t公司名稱: {:s} \t官網:http://www.{:s}.com' # 定義模板 context1 = template.format('7','百度','baidu') # 轉換的內容1 context2 = template.format('8','博客園','cnblogs') # 轉換的內容2 print(context1) # 輸出格式化後的字元串 print(context2) # 輸出格式化後的字元串
上面代碼運行後如下:
編號:000000007 公司名稱: 百度 官網:http://www.baidu.com
編號:000000008 公司名稱: 博客園 官網:http://www.cnblogs.com
在實際開發中,數值類型有多種顯示方式,比如貨幣形式、百分比形式等,使用format() 方法可以將數值格式化為不同的形式。下麵通過一個具體的實例進行說明。
實例06:格式化不同的數值類型數據
將不同類型的數據進行格式化並輸出,代碼如下:
import math # 導入Python的數字模塊 # 以貨幣形式顯示 print('51234+12354的結果是(以貨幣形式顯示):¥{:,.2f}元'.format(51234+12354)) print('{0:.1f}用科學計數法表示:{0:E}'.format(120000.1)) # 用科學計數法表示 print('π取5位小數:{:.5f}'.format(math.pi)) # 輸出小數點後五位 print('{0:d}的16進位結果是:{0:#x}'.format(100)) # 輸出十六進位 # 輸出百分比,並且不帶小數 print('天才是由{:.0%}的靈感,加上{:.0%}的汗水。'.format(0.01,0.99))
運行實例,將顯示如下結果。
51234+12354的結果是(以貨幣形式顯示):¥63,588.00元 120000.1用科學計數法表示:1.200001E+05 π取5位小數:3.14159 100的16進位結果是:0x64 天才是由1%的靈感,加上99%的汗水。
5.2 字元串編碼轉換
……在Python 3.X 中,預設採用的編碼格式為UTF-8,採用這種編碼有效地解決了中文亂碼的問題。
在Python 中,有兩種常用的字元串類型,分別為str 和bytes。其中,str 表示Unicode 字元(ASCII 或者其他);bytes 表示二進位數據(包括編碼的文本)。這兩種類型的字元串不能拼接在一起使用。通常情況下,str 在記憶體中以 Unicode 表示,一個字元對應若幹個位元組。但是如果在網路上傳輸,或者保存到磁碟上,就需要把str 轉換為位元組類型,即bytes 類型。
說明:bytes類型的數據是帶有b 首碼的字元串(用單引號或雙引號表示),例如,b'\xd2\xb0'和b'mr' 都是bytes類型的數據。
str類型和bytes類型之間可以通過encode() 和 decode() 方法進行轉換,這兩個方法是互逆的過程。
5.2.1 使用encode() 方法編碼
encode() 方法為 str 對象的方法,用於將字元串轉換為二進位數據(即bytes),也稱為“編碼”,其語法格式如下:
str.encode([encoding="utf-9"][,errors="strict"])
參數說明:
- str:表示要進行轉換的字元串。
- encoding="utf-8" :可選參數,用於指定進行轉碼時採用的字元編碼,預設為UTF-8,如果想使用簡體中文,也可以設置為gb2312。當只有這一個參數時,也可以省略前面的“encoding=”,直接寫編碼。
- errors=“strict”:可選參數,用於指定錯誤處理方式,其可選擇值可以是strict(遇到非法字元就拋出異常)、ignore(忽略非法字元)、replace(用“?”替換非法字元)或xmlcharrefreplace(使用XML 的字元引用)等,預設值為strict。
說明:在使用encode() 方法時,不會修改原字元串,如果需要修改原字元串,需要對其進行重新賦值。
例如,定義一個名稱為verse 的字元串,內容為“野渡無人舟自橫”,然後使用endoce() 方法將其採用GBK 編碼轉換為二進位數,並輸出原字元串和轉換後的內容,代碼如下:
verse = '野渡無人舟自橫' byte = verse.encode('GBK') # 採用GBK編碼轉換為二進位數據,不處理異常 print('原字元串:',verse) # 輸出原字元串(沒有改變) print('轉換後:',byte) # 輸出轉換後的二進位數據
上面的代碼執行後,將顯示以下內容:
原字元串: 野渡無人舟自橫 轉換後: b'\xd2\xb0\xb6\xc9\xce\xde\xc8\xcb\xd6\xdb\xd7\xd4\xba\xe1'
如果採用UTF-8 編碼,轉換後的二進位數據為:
原字元串: 野渡無人舟自橫 轉換後: b'\xe9\x87\x8e\xe6\xb8\xa1\xe6\x97\xa0\xe4\xba\xba\xe8\x88\x9f\xe8\x87\xaa\xe6\xa8\xaa'
5.2.2 使用decode() 方法編碼
decode() 方法為bytes 對象的方法用於將二進位數據轉換為字元串,即將使用encode() 方法轉換的結果再轉換為字元串,也稱為“解碼”。語法格式如下:
bytes.decode([encoding="utf-8"][,errors="strict"])
參數說明:
- bytes:表示要進行轉換的二進位數據,通常是encode() 方法轉換的結果。
- encoding="utf-8" :可選參數,用於指定進行解