字符串操作
1. 獲取字符串長(zhǎng)度
1. 1 len(str) : 用于指定要進(jìn)行長(zhǎng)度統(tǒng)計(jì)的字符串。
x = 'abcdef'
len(x) # out: 6
1. 2 獲取字符串的字節(jié)數(shù) : len(str.encode())
在 Python 中,不同的字符所占的字節(jié)數(shù)不同,數(shù)字、英文字母、小數(shù)點(diǎn)、下劃線以及空格,各占一個(gè)字節(jié),而一個(gè)漢字可能占 2~4 個(gè)字節(jié),具體占多少個(gè),取決于采用的編碼方式。
漢字在 GBK/GB2312 編碼中占用 2 個(gè)字節(jié),而在 UTF-8 編碼中一般占用 3 個(gè)字節(jié)。
獲取采用 UTF-8 編碼的字符串的長(zhǎng)度
str1 = "人生苦短,我用Python"
len(str1.encode()) # out: 27
獲取采用 GBK 編碼的字符串的長(zhǎng)度
str2 = "人生苦短,我用Python"
len(str2.encode('gbk')) # out: 20
2. 截取字符串(字符串切片)方法
2. 1 獲取單個(gè)字符
語(yǔ)法格式:str_name[index]
str_name 表示字符串名字,index 表示索引值。
Python 允許從字符串的兩端使用索引:
- 當(dāng)以字符串的左端(字符串的開(kāi)頭)為起點(diǎn)時(shí),索引是從 0 開(kāi)始計(jì)數(shù)的
- 當(dāng)以字符串的右端(字符串的末尾)為起點(diǎn)時(shí),索引是從 -1 開(kāi)始計(jì)數(shù)的
x = 'abcdefg'
# 獲取索引為3的字符
print(x[3]) # out: d
# 從右往左獲取索引為6的字符
print(x[-6]) # out: b
2. 2 獲取多個(gè)字符(字符串截去/字符串切片)
語(yǔ)法格式:str_name[start : end : step]
- start:表示要截取的第一個(gè)字符所在的索引(包含該字符)。如果不指定,默認(rèn)為 0,即字符串的開(kāi)頭截取;
- end:表示要截取的最后一個(gè)字符所在的索引(不包含該字符)。如果不指定,默認(rèn)為字符串的長(zhǎng)度;
- step:表示切片的步長(zhǎng),如果省略,則默認(rèn)為1,當(dāng)省略該值時(shí),最后一個(gè)冒號(hào)也可以省略。
str = "hello world!"
# 截取第2個(gè)字符
str[1] # out: 'e'
# 從第3個(gè)字符開(kāi)始截取
str[2:] # out: 'llo world!'
# 到第4個(gè)字符結(jié)束
str[:4] # out: 'hell'
# 截取1~5的字符
str[1:5] # out: 'ello'
# 截取最后一個(gè)字符
str[-1] # out: '!'
# 從第2個(gè)字符開(kāi)始~倒數(shù)第二個(gè)結(jié)束
str[2:-2] # out: 'llo worl'
3. 分割、合并及替換字符串方法
3. 1 split()方法:分割字符串(返回一個(gè)列表)
語(yǔ)法格式:str.split(sep, maxsplit)
sep:用于指定分隔符,可以包含多個(gè)字符。此參數(shù)默認(rèn)為 None,表示所有空字符,包括空格(默認(rèn))、換行符“\n”、制表符“\t”等。當(dāng)字符串中有連續(xù)的空格或其他空字符時(shí),都會(huì)被視為一個(gè)分隔符對(duì)字符串進(jìn)行分割。
maxsplit:可選參數(shù),用于指定分割的次數(shù),最后列表中子串的個(gè)數(shù)最多為maxsplit+1。如果不指定或者指定為 -1,則表示分割次數(shù)沒(méi)有限制。
如果不指定 sep 參數(shù),那么也不能指定 maxsplit 參數(shù)。
str = "i am a good boy!"
str.split() # 采用默認(rèn)分割符進(jìn)行分割
# out: ['i', 'am', 'a', 'good', 'boy!']
str.split(" ") # 采用空格進(jìn)行分割
# out: ['i', 'am', 'a', 'good', 'boy!']
str.split(" ", 3) # 采用空格進(jìn)行分割,并且只分割前3個(gè)
# out: ['i', 'am', 'a', 'good boy!']
3. 2 join()方法:合并字符串
語(yǔ)法格式:new_str = str.join(iterable)
iterable:做合并操作的源字符串?dāng)?shù)據(jù),允許以列表、元組等形式提供
# 將列表中的字符串合并成一個(gè)字符串。
list = ['console', 'log(dir)']
'.'.join(list) # out: console.log(dir)
# 將元組中的字符串合并成一個(gè)字符串。
dir = ('', 'usr', 'bin', 'env')
type(dir) # out: <class 'tuple'>
'/'.join(dir) # out: /usr/bin/env
3. 3 replace()方法:替換字符串
語(yǔ)法格式:new_str = str.replace(old, new[, max])
old -- 將被替換的子字符串。
new -- 新字符串,用于替換old子字符串。
max -- 可選字符串, 替換不超過(guò) max 次
str = 'hello world'
str.replace('world', 'python') # out: 'hello python'
str1 = 'hello-world'
str1.replace('-', '') # out: 'helloworld'
str1.replace('-', ' ') # out: 'hello world'
4. 檢索字符串方法
str:表示原字符串;
sub:表示要檢索的字符串;
start:指定檢索的起始位置,也就是從什么位置開(kāi)始檢測(cè)。如果不指定,默認(rèn)從頭開(kāi)始檢索;
end:指定檢索的終止位置,如果不指定,則表示一直檢索到結(jié)尾。
注意:范圍都是左閉右開(kāi)
4. 1 count()方法
語(yǔ)法格式:str.count(sub[,start[,end]])
作用:用于檢索指定字符串在另一個(gè)字符串中出現(xiàn)的次數(shù),如果檢索的字符串不存在則返回0,否則返回出現(xiàn)的次數(shù)。
str = "abcdefga"
str.count('a') # out: 2
str = "abcadebfgc"
str.count('b', 1) # out: 2
str.count('b', 2) # out: 1
str = "abcadebfgc"
str.count('a', 0, -3) # out: 2
str.count('c', 3, -4) # out: 0
4. 2 find()方法
語(yǔ)法格式:str.find(sub[,start[,end]])
作用:檢索是否包含指定的字符串,如果檢索的字符串不存在則返回-1,否則返回首次出現(xiàn)該字符串時(shí)的索引。
str = "abcdefga"
str.find('a') # out: 0
str = "abcadebfgc"
str.find('b', 1) # out: 1
str.find('b', 2) # out: 6
str = "abcadebfgc"
str.find('ab', 0, -3) # out: 0
str.find('c', 3, -4) # out: -1
4. 3 index()方法
語(yǔ)法格式:str.index(sub[,start[,end]])
作用:和find方法類似,也用于檢索是否包含指定的字符串,使用index方法,當(dāng)指定的字符串不存在時(shí)會(huì)拋異常。
str = "hello world!"
str.index('w') # out: 6
'''
index()和find()的區(qū)別:
index(): 指定的字符串不存在時(shí)會(huì)拋異常
find(): 檢索的字符串不存在則返回-1
'''
str.index('m') # 報(bào)錯(cuò)
str.find('m') # -1
4. 4 startswith()方法
語(yǔ)法格式:str.startswith(prefix[, start[, end]])
作用:檢索字符串是否以指定的字符串開(kāi)頭,如果是則返回true,否則返回false。
str = "hello world!"
str.startswith('hello') # out: True
str.startswith('hi') # out: False
4. 5 endswith()方法
語(yǔ)法格式:str.endswith(prefix[, start[, end]])
作用:檢索字符串是否以指定的字符串結(jié)尾,如果是則返回true,否則返回false。
str = "hello world!"
str.endswith('world!') # out: True
str.endswith('ha') # out: False
5.格式化字符串
語(yǔ)法格式:str.format(args)
str : 指定字符串的顯示樣式
args : 指定要進(jìn)行格式轉(zhuǎn)換的項(xiàng),如果有多項(xiàng),之間有逗號(hào)進(jìn)行分割。
學(xué)習(xí) format() 方法的難點(diǎn),在于搞清楚 str 顯示樣式的書(shū)寫(xiě)格式。在創(chuàng)建顯示樣式模板時(shí),需要使用{}和:來(lái)指定占位符,其完整的語(yǔ)法格式為:
{ [index][ : [ [fill] align] [sign] [#] [width] [.precision] [type] ] }
注意,格式中用 [ ] 括起來(lái)的參數(shù)都是可選參數(shù),即可以使用,也可以不使用。各個(gè)參數(shù)的含義如下:
index:指定:后邊設(shè)置的格式要作用到 args 中第幾個(gè)數(shù)據(jù),數(shù)據(jù)的索引值從 0 開(kāi)始。如果省略此選項(xiàng),則會(huì)根據(jù) args 中數(shù)據(jù)的先后順序自動(dòng)分配。
fill:指定空白處填充的字符。注意,當(dāng)填充字符為逗號(hào)(,)且作用于整數(shù)或浮點(diǎn)數(shù)時(shí),該整數(shù)(或浮點(diǎn)數(shù))會(huì)以逗號(hào)分隔的形式輸出,例如(1000000會(huì)輸出 1,000,000)。
align:指定數(shù)據(jù)的對(duì)齊方式,具體的對(duì)齊方式如表 1 所示。
表 1 align 參數(shù)及含義
| align | 含義 |
|---|---|
| < | 數(shù)據(jù)左對(duì)齊。 |
| > | 數(shù)據(jù)右對(duì)齊。 |
| = | 數(shù)據(jù)右對(duì)齊,同時(shí)將符號(hào)放置在填充內(nèi)容的最左側(cè),該選項(xiàng)只對(duì)數(shù)字類型有效。 |
| ^ | 數(shù)據(jù)居中,此選項(xiàng)需和 width 參數(shù)一起使用。 |
- sign:指定有無(wú)符號(hào)數(shù),此參數(shù)的值以及對(duì)應(yīng)的含義如表 2 所示。
表 2 sign 參數(shù)以含義
| sign參數(shù) | 含義 |
|---|---|
| + | 正數(shù)前加正號(hào),負(fù)數(shù)前加負(fù)號(hào)。 |
| - | 正數(shù)前不加正號(hào),負(fù)數(shù)前加負(fù)號(hào)。 |
| 空格 | 正數(shù)前加空格,負(fù)數(shù)前加負(fù)號(hào)。 |
| # | 對(duì)于二進(jìn)制數(shù)、八進(jìn)制數(shù)和十六進(jìn)制數(shù),使用此參數(shù),各進(jìn)制數(shù)前會(huì)分別顯示 0b、0o、0x前綴;反之則不顯示前綴。 |
- width:指定輸出數(shù)據(jù)時(shí)所占的寬度。
- .precision:指定保留的小數(shù)位數(shù)。
- type:指定輸出數(shù)據(jù)的具體類型,如表 3 所示。
表 3 type 占位符類型及含義
| type類型值 | 含義 |
|---|---|
| s | 對(duì)字符串類型格式化。 |
| d | 十進(jìn)制整數(shù)。 |
| c | 將十進(jìn)制整數(shù)自動(dòng)轉(zhuǎn)換成對(duì)應(yīng)的 Unicode 字符。 |
| e 或者 E | 轉(zhuǎn)換成科學(xué)計(jì)數(shù)法后,再格式化輸出。 |
| g 或 G | 自動(dòng)在 e 和 f(或 E 和 F)中切換。 |
| b | 將十進(jìn)制數(shù)自動(dòng)轉(zhuǎn)換成二進(jìn)制表示,再格式化輸出。 |
| o | 將十進(jìn)制數(shù)自動(dòng)轉(zhuǎn)換成八進(jìn)制表示,再格式化輸出。 |
| x 或者 X | 將十進(jìn)制數(shù)自動(dòng)轉(zhuǎn)換成十六進(jìn)制表示,再格式化輸出。 |
| f 或者 F | 轉(zhuǎn)換為浮點(diǎn)數(shù)(默認(rèn)小數(shù)點(diǎn)后保留 6 位),再格式化輸出。 |
| % | 顯示百分比(默認(rèn)顯示小數(shù)點(diǎn)后 6 位)。 |
案例:
在實(shí)際開(kāi)發(fā)中,數(shù)值類型有多種顯示需求,比如貨幣形式、百分比形式等,使用 format() 方法可以將數(shù)值格式化為不同的形式。
# 以貨幣形式顯示
print("貨幣形式:{:,d}".format(1000000))
# out: 貨幣形式:1,000,000
# 科學(xué)計(jì)數(shù)法表示
print("科學(xué)計(jì)數(shù)法:{:E}".format(1200.12))
# out: 科學(xué)計(jì)數(shù)法:1.200120E+03
# 以十六進(jìn)制表示
print("100的十六進(jìn)制:{:#x}".format(100))
# out: 100的十六進(jìn)制:0x64
# 輸出百分比形式
print("0.01的百分比表示:{:.0%}".format(0.01))
# out: 0.01的百分比表示:1%
6.去除字符串中的空格以及特殊字符
開(kāi)發(fā)中,我們會(huì)遇到這樣的需求,字符串前后(左右側(cè))不允許出現(xiàn)空格和特殊字符或者將用戶輸入的字符串中誤輸入的空格去除掉。這時(shí)我們就需要用到strip函數(shù)。
6. 1 strip()方法
語(yǔ)法格式 : str.strip([chars])
作用:去除字符串前后(左右側(cè))的空格或特殊字符
str1 = " hello world! "
str1.strip() # out: 'hello world!'
str2 = "#hello world#@#"
str2.strip('#')
# out: 'hello world#@'
str3 = "@hello world!@."
str3.strip('@.') # out: 'hello world!'
6.2 lstrip()方法
語(yǔ)法格式 : str.lstrip([chars])
作用:去除字符串前面(左側(cè))的空格或特殊字符
str1 = " hello world! "
str1.lstrip() # out: 'hello world! '
str2 = "#hello world#@#"
str2.lstrip('#')
# out: 'hello world#@#'
str3 = "@.hello world!@."
str3.lstrip('@.') # out: 'hello world!@.'
6. 3 rstrip()方法
語(yǔ)法格式 : str.rstrip([chars])
作用:去除字符串后面(右側(cè))的空格或特殊字符
str1 = " hello world! "
str1.rstrip() # out: ' hello world!'
str2 = "#hello world#@#"
str2.rstrip('#')
# out: '#hello world#@'
str3 = "@.hello world!@."
str3.rstrip('@.') # out: '@.hello world!'
7.字符串的大小寫(xiě)轉(zhuǎn)換
7.1 str.lower()
作用:將字符串中的大寫(xiě)字母轉(zhuǎn)換為小寫(xiě)字母
str = "Hello World!"
str.lower() # out: 'hello world!'
7.2 str.upper()
作用:將字符串中的小寫(xiě)字母轉(zhuǎn)換為大寫(xiě)字母
str = "Hello World!"
str.upper() # out: 'HELLO WORLD!'
7.3 str.capitalize()
作用:將字符串中的首字母變成大寫(xiě)
str = "Hello World!"
str.capitalize() # out: 'Hello world!'
7.4 str.title()
作用:將字符串中的每個(gè)單詞的首字母變成大寫(xiě)
str="hello world!"
str.title() # out: 'Hello World!'
7.5 str.swapcase()
作用:將字符串中的字母大小寫(xiě)互換(即小寫(xiě)字母轉(zhuǎn)換為大寫(xiě)字母,大寫(xiě)字母轉(zhuǎn)換為小寫(xiě)字母)
str = "Hello World!"
str.swapcase() # out: 'hELLO wORLD!'