字符串操作
1. 獲取字符串長度
1. 1 len(str)
: 用于指定要進(jìn)行長度統(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 編碼的字符串的長度
str1 = "人生苦短问裕,我用Python"
len(str1.encode()) # out: 27
獲取采用 GBK 編碼的字符串的長度
str2 = "人生苦短,我用Python"
len(str2.encode('gbk')) # out: 20
2. 截取字符串(字符串切片)方法
2. 1 獲取單個(gè)字符
語法格式:str_name[index]
str_name 表示字符串名字绝编,index 表示索引值僻澎。
Python 允許從字符串的兩端使用索引:
- 當(dāng)以字符串的左端(字符串的開頭)為起點(diǎn)時(shí),索引是從 0 開始計(jì)數(shù)的
- 當(dāng)以字符串的右端(字符串的末尾)為起點(diǎn)時(shí)十饥,索引是從 -1 開始計(jì)數(shù)的
x = 'abcdefg'
# 獲取索引為3的字符
print(x[3]) # out: d
# 從右往左獲取索引為6的字符
print(x[-6]) # out: b
2. 2 獲取多個(gè)字符(字符串截去/字符串切片)
語法格式:str_name[start : end : step]
- start:表示要截取的第一個(gè)字符所在的索引(包含該字符)窟勃。如果不指定,默認(rèn)為 0逗堵,即字符串的開頭截缺酢;
- end:表示要截取的最后一個(gè)字符所在的索引(不包含該字符)蜒秤。如果不指定汁咏,默認(rèn)為字符串的長度;
- step:表示切片的步長作媚,如果省略,則默認(rèn)為1攘滩,當(dāng)省略該值時(shí),最后一個(gè)冒號也可以省略纸泡。
str = "hello world!"
# 截取第2個(gè)字符
str[1] # out: 'e'
# 從第3個(gè)字符開始截取
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è)字符開始~倒數(shù)第二個(gè)結(jié)束
str[2:-2] # out: 'llo worl'
3. 分割漂问、合并及替換字符串方法
3. 1 split()
方法:分割字符串(返回一個(gè)列表)
語法格式:str.split(sep, maxsplit)
sep:用于指定分隔符,可以包含多個(gè)字符。此參數(shù)默認(rèn)為 None蚤假,表示所有空字符栏饮,包括空格(默認(rèn))、換行符“\n”磷仰、制表符“\t”等袍嬉。當(dāng)字符串中有連續(xù)的空格或其他空字符時(shí),都會被視為一個(gè)分隔符對字符串進(jìn)行分割灶平。
maxsplit:可選參數(shù)伺通,用于指定分割的次數(shù),最后列表中子串的個(gè)數(shù)最多為maxsplit+1民逼。如果不指定或者指定為 -1泵殴,則表示分割次數(shù)沒有限制。
如果不指定 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()
方法:合并字符串
語法格式: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()
方法:替換字符串
語法格式:new_str = str.replace(old, new[, max])
old -- 將被替換的子字符串妇多。
new -- 新字符串,用于替換old子字符串燕侠。
max -- 可選字符串, 替換不超過 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:指定檢索的起始位置绢彤,也就是從什么位置開始檢測七问。如果不指定,默認(rèn)從頭開始檢索茫舶;
end:指定檢索的終止位置械巡,如果不指定,則表示一直檢索到結(jié)尾饶氏。
注意:范圍都是左閉右開
4. 1 count()
方法
語法格式: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()
方法
語法格式: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()
方法
語法格式:str.index(sub[,start[,end]])
作用:和find方法類似挣磨,也用于檢索是否包含指定的字符串菲宴,使用index方法,當(dāng)指定的字符串不存在時(shí)會拋異常趋急。
str = "hello world!"
str.index('w') # out: 6
'''
index()和find()的區(qū)別:
index(): 指定的字符串不存在時(shí)會拋異常
find(): 檢索的字符串不存在則返回-1
'''
str.index('m') # 報(bào)錯(cuò)
str.find('m') # -1
4. 4 startswith()
方法
語法格式:str.startswith(prefix[, start[, end]])
作用:檢索字符串是否以指定的字符串開頭,如果是則返回true势誊,否則返回false呜达。
str = "hello world!"
str.startswith('hello') # out: True
str.startswith('hi') # out: False
4. 5 endswith()
方法
語法格式:str.endswith(prefix[, start[, end]])
作用:檢索字符串是否以指定的字符串結(jié)尾,如果是則返回true粟耻,否則返回false查近。
str = "hello world!"
str.endswith('world!') # out: True
str.endswith('ha') # out: False
5.格式化字符串
語法格式:str.format(args)
str : 指定字符串的顯示樣式
args : 指定要進(jìn)行格式轉(zhuǎn)換的項(xiàng),如果有多項(xiàng)挤忙,之間有逗號進(jìn)行分割霜威。
學(xué)習(xí) format()
方法的難點(diǎn),在于搞清楚 str 顯示樣式的書寫格式册烈。在創(chuàng)建顯示樣式模板時(shí)戈泼,需要使用{}
和:
來指定占位符,其完整的語法格式為:
{ [index][ : [ [fill] align] [sign] [#] [width] [.precision] [type] ] }
注意赏僧,格式中用 [ ] 括起來的參數(shù)都是可選參數(shù)大猛,即可以使用,也可以不使用淀零。各個(gè)參數(shù)的含義如下:
index:指定:后邊設(shè)置的格式要作用到 args 中第幾個(gè)數(shù)據(jù)挽绩,數(shù)據(jù)的索引值從 0 開始。如果省略此選項(xiàng)驾中,則會根據(jù) args 中數(shù)據(jù)的先后順序自動分配唉堪。
fill:指定空白處填充的字符。注意肩民,當(dāng)填充字符為逗號(,)且作用于整數(shù)或浮點(diǎn)數(shù)時(shí)唠亚,該整數(shù)(或浮點(diǎn)數(shù))會以逗號分隔的形式輸出,例如(1000000會輸出 1,000,000)此改。
align:指定數(shù)據(jù)的對齊方式趾撵,具體的對齊方式如表 1 所示。
表 1 align 參數(shù)及含義
align | 含義 |
---|---|
< | 數(shù)據(jù)左對齊共啃。 |
> | 數(shù)據(jù)右對齊占调。 |
= | 數(shù)據(jù)右對齊,同時(shí)將符號放置在填充內(nèi)容的最左側(cè)移剪,該選項(xiàng)只對數(shù)字類型有效究珊。 |
^ | 數(shù)據(jù)居中,此選項(xiàng)需和 width 參數(shù)一起使用纵苛。 |
- sign:指定有無符號數(shù)剿涮,此參數(shù)的值以及對應(yīng)的含義如表 2 所示言津。
表 2 sign 參數(shù)以含義
sign參數(shù) | 含義 |
---|---|
+ | 正數(shù)前加正號,負(fù)數(shù)前加負(fù)號取试。 |
- | 正數(shù)前不加正號悬槽,負(fù)數(shù)前加負(fù)號。 |
空格 | 正數(shù)前加空格瞬浓,負(fù)數(shù)前加負(fù)號初婆。 |
# | 對于二進(jìn)制數(shù)、八進(jìn)制數(shù)和十六進(jìn)制數(shù)猿棉,使用此參數(shù)磅叛,各進(jìn)制數(shù)前會分別顯示 0b、0o萨赁、0x前綴弊琴;反之則不顯示前綴。 |
- width:指定輸出數(shù)據(jù)時(shí)所占的寬度杖爽。
- .precision:指定保留的小數(shù)位數(shù)敲董。
- type:指定輸出數(shù)據(jù)的具體類型,如表 3 所示慰安。
表 3 type 占位符類型及含義
type類型值 | 含義 |
---|---|
s | 對字符串類型格式化臣缀。 |
d | 十進(jìn)制整數(shù)。 |
c | 將十進(jìn)制整數(shù)自動轉(zhuǎn)換成對應(yīng)的 Unicode 字符泻帮。 |
e 或者 E | 轉(zhuǎn)換成科學(xué)計(jì)數(shù)法后精置,再格式化輸出。 |
g 或 G | 自動在 e 和 f(或 E 和 F)中切換锣杂。 |
b | 將十進(jìn)制數(shù)自動轉(zhuǎn)換成二進(jìn)制表示脂倦,再格式化輸出。 |
o | 將十進(jìn)制數(shù)自動轉(zhuǎn)換成八進(jìn)制表示元莫,再格式化輸出赖阻。 |
x 或者 X | 將十進(jìn)制數(shù)自動轉(zhuǎn)換成十六進(jìn)制表示,再格式化輸出踱蠢。 |
f 或者 F | 轉(zhuǎn)換為浮點(diǎn)數(shù)(默認(rèn)小數(shù)點(diǎn)后保留 6 位)火欧,再格式化輸出。 |
% | 顯示百分比(默認(rèn)顯示小數(shù)點(diǎn)后 6 位)茎截。 |
案例:
在實(shí)際開發(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.去除字符串中的空格以及特殊字符
開發(fā)中撕攒,我們會遇到這樣的需求陡鹃,字符串前后(左右側(cè))不允許出現(xiàn)空格和特殊字符或者將用戶輸入的字符串中誤輸入的空格去除掉烘浦。這時(shí)我們就需要用到strip函數(shù)。
6. 1 strip()
方法
語法格式 : 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()
方法
語法格式 : 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()
方法
語法格式 : 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.字符串的大小寫轉(zhuǎn)換
7.1 str.lower()
作用:將字符串中的大寫字母轉(zhuǎn)換為小寫字母
str = "Hello World!"
str.lower() # out: 'hello world!'
7.2 str.upper()
作用:將字符串中的小寫字母轉(zhuǎn)換為大寫字母
str = "Hello World!"
str.upper() # out: 'HELLO WORLD!'
7.3 str.capitalize()
作用:將字符串中的首字母變成大寫
str = "Hello World!"
str.capitalize() # out: 'Hello world!'
7.4 str.title()
作用:將字符串中的每個(gè)單詞的首字母變成大寫
str="hello world!"
str.title() # out: 'Hello World!'
7.5 str.swapcase()
作用:將字符串中的字母大小寫互換(即小寫字母轉(zhuǎn)換為大寫字母,大寫字母轉(zhuǎn)換為小寫字母)
str = "Hello World!"
str.swapcase() # out: 'hELLO wORLD!'