Python中的字符串必須使用成對的引號括起來,引號可以是單引號、雙引號、三引號。
一、 字符串基礎
1、 字符串和轉義字符
字符串的內容幾乎可以是任何字符,可以是英文字符,也可以是中文字符。字符串是用成對的引號包起來的,當字符串中有引號時,需要做特殊處理:
(1)、使用不同的引號將字符串括起來,例如使用雙引號表示字符串時,字符串內部可以有單引號出現。
(2)、對引號進行轉義,使用反斜線(\)將字符串中的特殊字符進行轉義。
示例:
str1 = "It's a cat" # 字符串中含有單引號,外面使用雙引號括起來
str2 = 'Python is a "programe" language' # 字符串含有雙引號,外面使用單引號
str3 = 'Python\'s a "programe" language' # 使用反斜線轉義字符串中的單引號
str4 = """'Python's a "programe" language""" # 使用三引號表示字符串時,字符串內可以有單引號、雙引號
2、字符串拼接
s1 = 'hello,' "michael" # 同一行中兩個緊挨着的字符串,自動拼接成一個字符串。
Python中真正用於拼接字符串的運算符是加號(+),示例如下:
s2 = 'hello, '
s3 = 'michael'
print(s2 + s3) # 輸出是:hello, michael
還可以使用字符串的 join 方法拼接,例如:
"".join((s2, s3))
3、repr函數和字符串
Python不允許直接拼接字符串和數值,但是可先將數值轉換成字符串后再拼接。可使用 str() 或 repr() 函數將數值轉換成字符串。
示例:
s1 = "我的年齡是:"
age = 25
print(s1 + age) # 字符串和數值直接拼接,報 TypeError 錯誤
print(s1 + str(age)) # 使用str 方法將數值轉換為字符串后再拼接,輸出是:我的年齡是:25
print(s1 + repr(age)) # 使用repr 方法將數值轉換為字符串后再拼接,輸出是:我的年齡是:25
str 是Python的內置類型,repr() 只是一個函數,repr 的另一個功能是以Python表達式的形式來表示值。例如:
print(s1) # 輸出是:我的年齡是:
print(repr(s1)) # 輸出是:'我的年齡是:'
使用 repr() 對字符串進行轉換時,輸出的結果中字符串在引號內,這就是字符串的 Python 的表達式形式。
在交互式解釋器中,輸入一個變量或表達式時,Python 會自動用 repr() 函數處理該變量表達式。
4、 使用input 和 raw_input 獲取用戶輸入
input() 函數可用來獲取用戶輸入,在這個函數中可以傳遞一個參數用於提示信息。input()函數總是將用戶輸入的內容放入字符串中,因此用戶可以輸入任何內容。如果輸入的純數值,並希望用於數值運算時,就需要先進行類型轉換后再計算。
在Python2.x 版本中的 raw_input() 函數的作用與Python3版本中的input()函數一樣。
在Python2版本中的input()函數則要求用戶輸入的必須是符合 Python 語法的表達式。例如要輸入數值:123,要輸入字符串:'abc',這里輸入的字符串必須用引號括起來,否則就會報錯。
5、 長字符串
長字符串是使用成對的三引號引起來的字符串,長字符串內可以放置任何內容,可以有單引號、雙引號、換行符等。長字符串如果沒有賦值給任何變量,這個字符串就被解釋器忽略,相當於是注釋。
轉義字符(\)可對換行符進行轉義,經過轉義后的兩行字符串實際是一行。例如:
s2 = 'Linux systems is \
very strong!'
這個s2 字符串輸入的是2行,但實際上只是一行字符串。
要對表達式換行,同樣可以使用轉義字符(\)進行轉義,例如:
result = 20 * 10 / 2 + 100 - \
20 * 5
這個result 變量雖然有兩行,但只有一個表達式。
6、原始字符串
在字符串中反斜線有特殊的作用,要表示反斜線的本義時,就需要對反斜線進行轉義,對反斜線轉義的方法是(\\),這樣寫免不了有些麻煩。這時可在字符串前面加上 “r”,表示原始字符串,原始字符串不會把反斜線當成特殊字符。例如下面這個表示windows路徑的字符串:
r'D:\Python\python38\Scripts\math.py'
原始字符串有引號時,同樣要對引號進行轉義,此時轉義的反斜線會變成字符串的一部分。例如:
s3 =r'"what\'s your name?", michael'
print(s3) # 輸出是:"what\'s your name?", michael
原始字符串中的反斜線會對引號進行轉義,在字符串的結尾處不能有反斜線,否則字符串不能正確結束。如果一定要在字符串結尾使用反斜線,字符串可以使用成對三引號引起來,也可以將反斜線單獨寫,例如下面這樣:
s4 = r'Hello World!' '\\'
print(s4) # 輸出是:Hello World!\
7、 字節串(bytes)
字符串(str)由多個字符組成,以字符為單位進行操作。字節串(bytes)由多個字節組成,以字節為單位進行操作。
str操作的是字符,bytes操作的是字節。這兩個支持的所有方法基本相同,bytes也是不可變序列。
bytes以字節(二進制格式)序列來記錄數據,數據表示的內容由程序決定。采用合適的字符集,字符串可以轉換成字節串;反之,字節串也可以恢復成對應的字符串。
bytes保存的是原始字節(二進制格式)數據,bytes對象可用於網絡上傳輸數據,也可用於存儲各種二進制格式的文件,如圖片、音樂等。
字符串轉換成bytes對象,有下面三種方式:
(1)、字符串內容全是ASCII字符時,可直接在字符串前面加 b 來構建字節串值。
(2)、調用bytes()函數(實際是 bytes 的構造方法)將字符串按指定字符集轉換成字節串,如果不指定字符集,默認使用 UTF-8 字符集。
(3)、調用字符串本身的 encode() 方法將字符串按指定字符集轉換成字節串,如果不指定字符集,默認使用 UTF-8字符集。
創建字節串示例:
b1 = bytes() # 創建一個空 bytes
b2 = b'' # 創建一個空 bytes
b3 = b'Python' # 在字符串前面加前綴 b,創建的是 bytes 類型的值
print(b3) # 輸出是:b'Python'
print(b3[0]) # 輸出是第一個字母 P 的ASCII碼值:80
print(b3[2:5]) # 輸出仍然是字節串:b'tho'
# 調用 bytes 方法將字符串轉換成 bytes 對象,並指明使用 utf-8 字符集編碼
b4 = bytes("Python編程可應用於多個領域", encoding='utf-8')
print(b4) # 輸出的是字節碼,中文字符是 UTF-8 編碼,輸出類似:b'Python\xe7\xbc...'
print(b4.decode('utf-8')) # 輸出時可使用 decode() 方法按指定字符集解碼,此時輸出字符串的內容
# 不使用 bytes 方法,直接調用字符串的 encode 方法同樣可以按指定字符集編碼
b5 = "Python編程可應用於多個領域".encode('utf-8')
print(b5) # 輸出類似於:b'Python\xe7\xbc...'
字符串與字節串非常相似,但是字符串里的每個數據單元都是1字節。字節(Byte)表示1字節,包含8位(bit),1bit就是1位,存儲的值是0或1。
字節串中每個數據單元是字節,也就是8位,其中每4位可以用一個十六進制數(0~f)來表示,因此每個字節可以用兩個十六進制數來表示,所以在上面的輸出中有“\xe7\xbc”,其中“\xe7”就表示1字節,在這個字節中 \x 表示十六進制,e7就是兩位的十六進制數。
此外,在程序中的 bytes 對象,可以調用其 decode() 方法將其解碼成字符串。例如 b5 字節串就可以調用 decode() 方法:
print(b5.decode('utf-8'))
字符集概念簡介:
在計算機底層不能直接保存字符。計算機科學家的方法是:為每個字符編號,當程序保存數據時,實際保存的是字符的編號;當程序讀取字符時,實際讀取的也是編號。根據編號在“編號-字符對應表”(簡稱碼表)上得到實際的字符。平時說的字符集,就是由所有字符的編號組成的總和。最初的ASCII碼表只考慮了英文字母、數字、特殊符號,因此要表示這些英文字母、數字、特殊符號只要1個字節(8位,可支持256個字符編號)即可。后來其他國家都為本國文字進行編號,從而制訂了本國的字符集(比如我國的GB2312、GBK等),這些字符集並不兼容。為了兼容各國的字符集,就用了兩個字節(16位,支持65536個字符編碼)對各國的文字進行統一編號,這就出現了Unicode字符集。實際使用的UTF-8、UTF-16等都屬於Unicode字符集。
另外同一個編號在不同的字符集中代表的字符完全有可能是不同的。比如編號111在一個字符集可以表示“中”字,在另一個字符集中可以表示“國”字。因此,對於同一個字符串,如果采用不同的字符集來生成bytes 對象,得到的是不同的 bytes 對象。
示例:
b1 = bytes('你好,成都', encoding='utf-8') # 定義一個字節串,並指定編碼為 utf-8 字符集
print(b1) # 輸出b1字節串,輸出是:b'\xe4\xbd\xa0\xe5\xa5\xbd\xef\xbc\x8c\xe6\x88\x90\xe9\x83\xbd'
print(b1.decode('gbk')) # 報錯或者輸出亂碼,不能用GBK字符集解碼 utf-8 字符串
print(b1.decode('GB2312')) # 報錯或者輸出亂碼,不能用GB2312字符集解碼 utf-8 字符串
print(b1.decode()) # 默認使用 utf-8 字符集解碼字符串
print(b1.decode('utf-8')) # 明確指定使用 utf-8 字符集解碼字符串
二、 深入使用字符串
字符串在每一種編程語言中都是最常用的類型之一,非常重要。
1、 轉義字符
在字符串中使用反斜線(\)進行轉義。如果字符串中本身含有反斜線時,需要使用雙反斜線轉義(\\)。在Python中除了這個轉義符外,還有下面這些轉義字符。
\b 退格符
\n 換行符
\r 回車符
\t 制表符
\" 雙引號
\' 單引號
\\ 反斜線
示例:
s1 = 'Hello\nworld!\nHello\npython!' # 在字符串中加入換行符 \n
s2 = '名稱\t\t價格\t\t\數量' # 在字符串加入制表符
2、 字符串格式化
Python中使用 “%” 對各種類型數據格式化輸出。例如下面的代碼:
num = 100
print("the number is %s" % num)
上面的print 代碼中就是格式化輸出代碼,這里 print 函數內有三個部分,第一部分是格式化字符串(字符串模板),在格式化字符串中的 “%s” 表示占位符,表示這個位置會被第三部分的變量或表達式的值代替;第二部分是固定使用的分隔符 “%”;第三部分用於替換第一部分的占位符。
格式化字符串中的 “%s” 是轉換說明符(Conversion Specifier),其作用是一個占位符,它會被后面的變量表達式的值替換。“%s”指定將變量或值使用 str() 函數轉換為字符串。在格式化字符串中當有多個 “%s” 點位符時,第三部分也要對應的提供多個變量,並將這些變量放在小括號中。例如下面的代碼:
name = 'michael'
age = 25
print("%s is %s years old!" % (name, age)) # 第一部分有兩個點位符,第三部分就提供兩個變量
下面總結Python中的轉換說明符:
d,i 轉換為帶符號的十進制形式整數
o 轉換為帶符號的八進制形式整數
x,X 轉換為帶符號的十六進制形式整數
e,E 轉化為科學計算法表示的浮點數
f,F 轉換為十進制形式的浮點數
g 智能選擇使用 f 或 g 格式
G 智能選擇使用 F 或 G 格式
C 轉換為單字符(只接受整數或單字符字符串)
r 使用 repr() 將變量或表達式轉換為字符串
s 使用 str() 將變量或表達式轉換為字符串
使用這些轉換說明符時,可指定轉換后最小寬度。示例如下:
num = -29
print("num is: %6i" % num) # 輸出帶符號的整數,6位寬,輸出:num is: -29
print("num is: %6d" % num) # 同上
print("num is: %6o" % num) # 輸出帶符號的八進制整數,6位寬,輸出:num is: -35
print("num is: %6x" % num) # 輸出帶符號的十六進制整數,6位寬,輸出:num is: -1d
print("num is: %6X" % num) # 輸出帶符號的十六進制整數,6位寬,輸出:num is: -1D
print("num is: %6s" % num) # 使用 str() 函數將變量或表達式轉化為字符串,輸出:num is: -29
通過指定了字符串的最小寬度為6位后,在輸出轉換后的數值時總寬度為6,自動在數值前面補充空格來對齊。默認輸出是右對齊,不夠寬時左邊補充空格。Python還允許在最小寬度之間添加一個標志來改變這種行為,這種標志有3個,這些標志可以同時存在,標志如下:
- :指定左對齊。
+ :表示數值總要帶符號,正數帶“+”號,負數帶 “-” 號。
0 :表示不補充空格,而是補充 0。
示例如下:
num = 39
print("num is: %06d" % num) # 最小寬度為6,左邊不足的用 0 補充,輸出:num is: 000039
print("num is: %+06d" % num) # 最小寬度為6,左邊補0,總是帶上符號,輸出:num is: +00039
print("num is: %-6d" % num) # 最小寬度為6,左對齊,輸出是:num is: 39
在轉換浮點數時,可以指定小數點后的位數;轉換字符串時,可以指定轉換后的字符串的最大字符數。這個標志叫精度值,這個標志放在最小寬度之后,中間用(.)隔開。示例如下:
pi = 3.1415926
print("pi is: %10.4f" % pi) # 最小寬度為10位,小數點后保留4位,右對齊,輸出:pi is: 3.1416
print("pi is: %010.4f" % pi) # 最小寬度為10位,小數點后保留4位,右對齊,左邊補0,輸出:pi is: 00003.1416
print("pi is: %+010.4f" % pi) # 最小寬度為10位,小數點后保留4位,右對齊,左邊補0,帶符號位,輸出:pi is: +0003.1416
name = 'Michael'
print("the name is: %.4s" % name) # 字符串保留4個字符,輸出:the name is: Mich
print("the name is: %8.2s" % name) # 保留2個字符,最小寬度為8位,輸出:the name is: Mi
三、序列相關方法
字符串是由多個字符組成的,因此可以通過索引來操作字符。可指定獲取索引處的字符,也可獲取指定字符在字符串中的位置。
字符串的索引在方括號中表示,字符串的索引從0開始,即第一個字符的索引是0,第二個字符的索引是1,以此類推。還可以從最后一個字符開始索引,最后一個字符的索引為-1,倒數第二個字符的索引是-2,以此類推。
此外,在索引時如果超出字符串的長度就報 IndexError 錯誤。示例如下:
s1 = "python is very Good!" # 定義一個字符串
print(s1[3]) # 獲取 s1 中索引為 3 的字符,輸出是:h
print(s1[-5]) # 獲取 s1 中從右邊開始,索引為 5 的字符,輸出是:G
在方括號中可以使用范圍(或者切片)來獲取字符串中的某一段字符,常叫作子串,在使用范圍時,左邊索引包含,右邊索引不包含。示例如下:
print(s1[3:6]) # 獲取 s1 中從索引3到索引6(不包含)的子串,輸出是:hon
print(s1[3:-8]) # 獲取 s1 中從索引3到倒數第8個(不包含)字符的子串,輸出是:hon is ve
print(s1[-8:-4]) # 獲取 s1 中從索引倒數第8個到倒數第4個字符的子串,輸出;ry G
在使用切片索引時,可以省略起始或結束索引。省略起始索引就從字符串的開始處截取,省略結束索引就截取到字符串的結束處。示例如下:
print(s1[8:]) # 獲取 s1 中從索引 8 到結束的子串,輸出是:s very Good!
print(s1[-8:]) # 獲取 s1 中從倒數第8個字符到結束的子串,輸出是:ry Good!
print(s1[:6]) # 獲取 s1 中從開始到索引6的子串,也就是前面6個字符,輸出是:python
print(s1[:-6]) # 獲取 s1 中從開始到倒數第6個字符的子串,輸出是:python is very
Python字符串還支持 in 運算符來判斷是否包含某個子串,判斷結果是True 或 False,示例如下:
print('python' in s1) # 輸出:True
print('java' not in s1) # 還可以使用 not in 來判斷是否不包含,輸出:True
len() 函數獲取字符串長度。min()和max()函數獲取字符串中最小字符和最大字符,示例如下:
print(len(s1)) # 輸出:24
print(len('python')) # 輸出:6
print(max(s1)) # 字符串中最大的字符,輸出:y
print(min(s1)) # 字符串最小的字符,輸出是 空格
四、 大小寫相關的方法
Python的字符串由內建的 str 類構建,這個類包含有很多的方法。Python是“自帶文檔”的,在使用幫助時,要熟悉下面兩個函數:
dir():列出指定類或模塊包含的全部內容(包括函數、方法、類、變量等)。
help():查看某個函數或方法的幫助文檔。
在查看 str 類包含的全部內容,可在交互式解釋器中輸入命令:
dir(str)
在列出的 str 類方法中,以“__”開頭、“__”結尾的方法約定是私有方法,不希望外部直接使用。要查看某個方法的用法,可使用help()函數:
help(str.title)
在str類中與大小寫有關的常用方法如下:
(1)、title():將每個單詞的首字母改為大寫,其它字母改為小寫。
(2)、lower():將整個字符串改為小寫。
(3)、upper():將整個字符串改為大寫。
示例如下:
s = 'hLLEO world' # 定義字符串
print(s.title()) # 單詞首字母大寫,其余字母小寫,輸出:Hlleo World
print(s.lower()) # 全部字母小寫,輸出:hlleo world
print(s.upper()) # 全部字母大寫,輸出:HLLEO WORLD
五、 刪除空白
str 類中刪除空白的常用方法有:
(1)、strip():刪除字符串起始和結束處的空白。
(2)、lstrip():刪除字符串前面(左邊)的空白。
(3)、rstrip():刪除字符串后面(右邊)的空白。
注意,在Python中字符串是不可變類型,不管使用什么方法修改字符串,產生的結果都是副本,原字符串不受任何影響。
查看字符串刪除空白函數的幫助信息:
help(str.strip)
從幫助信息可以看出,這個 strip() 方法還可以傳入參數,當傳入參數時,就刪除字符串兩邊相應的字符。同理 lstrip() 和 rstrip()
函數同樣可以傳入參數。
示例如下:
s = " python is very strong! "
print(s.strip()) # 刪除字符串兩邊的空白,輸出:python is very strong!
print(s.lstrip()) # 刪除字符串左邊空白
print(s.rstrip()) # 刪除字符串右邊空白
s2 = "python is very strong!"
print(s2.strip('pio!')) # 刪除字符串兩邊的 p、i、o、! 字符,輸出是:ython is very strong
print(s2.lstrip('pio!')) # 刪除字符串左邊的 p、i、o、! 字符
print(s2.rstrip('pio!')) # 刪除字符串右邊的 p、i、o、! 字符
六、字符串的查找、替換有關的方法
str 類提供的常用查找、替換等操作方法如下。
(1)、startswith():判斷字符串是否以指定子串開頭。
(2)、endswith():判斷字符串是否以指定子串結尾。
(3)、find():查找指定子串在字符串中出現的位置,如果沒有找到指定的子串,則返回 -1。
(4)、index():查找指定子串在字符串中出現的位置,如果沒有找到指定子串,則引發ValueError錯誤。
(5)、replace():使用指定子串替換字符串中的目標子串。第三個參數可以指定替換次數。
(6)、translate():使用指定的翻譯映射表對字符串執行替換。
示例如下:
s = "python is very strong!"
print(s.startswith('py')) # 判斷 s 字符串是否以 py 開頭,是就返回 True。
print(s.endswith('rong!')) # 判斷 s 字符串是否以 rong! 結尾,是就返回 True
print(s.find('on')) # 查找 s 字符串中 on 出現的位置,注意索引是從 0 開始,輸出:4
print(s.index('on')) # 同上,如果未找到就報錯,輸出:4
print(s.find('on', 5)) # 從索引 5 處開始查找 on 出現的位置,輸出:18
print(s.index('on', 5)) # 從索引 5 處開始查找 on 出現的位置,未找到則報錯,輸出:18
print(s.replace('on', 'AA',1)) # 將字符串中的1個 on 替換為 AA,第三個參數1表示替換1次。
table = {111: 945, 112: 946, 116: 964} # 定義翻譯映射表:111(o) -> 945(α),112(p) -> 946(β),116(t) -> 964(τ)
print(s.translate(table)) # 使用翻譯映射表替換,輸出:βyτhαn is very sτrαng!
上面的字符翻譯示例中,str 類的 translate() 方法需要根據翻譯映射表對字符串進行查找、替換。這個翻譯映射表是自定義的,在
實際開發工作中,這樣自定義翻譯映射表未免太麻煩。str 類提供了一個 maketrans() 方法,這個方法可以方便的創建翻譯映射表。
table = str.maketrans('opt', 'αβτ') # 使用 str 類的 maketrans 創建字符映射表
table # 輸出結果是:{111: 945, 112: 946, 116: 964}
在創建映射表時,定義的是字符與字符之間的對應關系,但是翻譯映射表不能使用字符本身,必須使用字符的編碼。
在Python2.x 版本中,str 類沒有 maketrans() 方法,該方法由 string 模塊提供。例如在Python2.x 版本中執行方法如下:
import string
table = string.maketrans('abc', '123') # 輸出結果不直觀,但是可以作為 translate() 方法的參數使用
七、 分割、連接方法
str 類提供的分割方法是 split(),連接方法是 join()。
(1)、split():將字符串按指定分割符分割成多個字符串。
(2)、join():將多個字符串連接成一個字符串。
示例如下:
s = "python is very strong!"
print(s.split()) # 使用空白對字符串分隔,輸出:['python', 'is', 'very', 'strong!']
print(s.split(None, 2)) # 使用空白對字符串分隔,最多分隔前兩個單詞,輸出:['python', 'is', 'very strong!']
print(s.split('is')) # 使用指定字符作為分隔符,輸出:['python ', ' very strong!']
alist = s.split() # 將分隔后的結果賦值給變量 alist
print(':'.join(alist)) # 使用冒號作為連接符,輸出:python:is:very:strong!
由上面示例可知,str 類的 split() 和 join() 方法互為逆操作,split() 方法是將字符串分割成多個子串;join() 是將多個子串連接成一個字符串。