09-字符串操作

字符串操作

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!'
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末萍鲸,一起剝皮案震驚了整個(gè)濱河市闷叉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌脊阴,老刑警劉巖片习,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蹬叭,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)状知,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進(jìn)店門秽五,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人饥悴,你說我怎么就攤上這事坦喘。” “怎么了西设?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵瓣铣,是天一觀的道長。 經(jīng)常有香客問我贷揽,道長棠笑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任禽绪,我火速辦了婚禮蓖救,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘印屁。我一直安慰自己循捺,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布雄人。 她就那樣靜靜地躺著从橘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪础钠。 梳的紋絲不亂的頭發(fā)上恰力,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天,我揣著相機(jī)與錄音旗吁,去河邊找鬼牺勾。 笑死,一個(gè)胖子當(dāng)著我的面吹牛阵漏,可吹牛的內(nèi)容都是我干的驻民。 我是一名探鬼主播翻具,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼回还!你這毒婦竟也來了裆泳?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤柠硕,失蹤者是張志新(化名)和其女友劉穎工禾,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蝗柔,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡闻葵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了癣丧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片槽畔。...
    茶點(diǎn)故事閱讀 38,643評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖胁编,靈堂內(nèi)的尸體忽然破棺而出厢钧,到底是詐尸還是另有隱情,我是刑警寧澤嬉橙,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布早直,位于F島的核電站,受9級特大地震影響市框,放射性物質(zhì)發(fā)生泄漏霞扬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一枫振、第九天 我趴在偏房一處隱蔽的房頂上張望祥得。 院中可真熱鬧,春花似錦蒋得、人聲如沸级及。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽饮焦。三九已至,卻和暖如春窍侧,著一層夾襖步出監(jiān)牢的瞬間县踢,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工伟件, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留硼啤,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓斧账,卻偏偏與公主長得像谴返,于是被迫代替她去往敵國和親煞肾。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評論 2 348