一文搞定 Python 字符串操作(上)

文章首發(fā)于微信公眾號(hào):可樂(lè)python說(shuō)

前言

Python3 中有六個(gè)標(biāo)準(zhǔn)的數(shù)據(jù)類型花沉,它們分別是數(shù)字(Number)坟比、字符串(String)本姥、列表(List)舞肆、元組(Tuple)焦辅、集合(Set)、字典(Dictionary)椿胯。

數(shù)據(jù)類型分類可變數(shù)據(jù)類型筷登、和不可變數(shù)據(jù)類型,其中可變類型包括列表压状、字典仆抵、集合,不可變類型包括數(shù)字种冬、字符串镣丑、元組。

本文主要介紹 Python 中字符串的內(nèi)建函數(shù)娱两,并配上相關(guān)代碼莺匠,便于理解、吸收十兢。


字符串簡(jiǎn)介

Python中的字符串使用單引號(hào) '' 或雙引號(hào) "" 括起來(lái)趣竣,同時(shí)使用反斜杠 \ 轉(zhuǎn)義特殊字符,實(shí)際工作當(dāng)中旱物,接觸遥缕、處理最多的數(shù)據(jù)類型,莫過(guò)于字符串了宵呛。

下面使用兩種方式定義字符串单匣,兩種方式均可

>>> single_str = 'a我是單引號(hào)括起來(lái)的字符串'
>>> type(single_str)      # type 查看數(shù)據(jù)類型
<class 'str'>

>>> double_str = "a我是雙引號(hào)括起來(lái)的字符串"
>>> type(double_str)      # type 查看數(shù)據(jù)類型
<class 'str'>

字符串操作

我將字符串操作分為五大類,分別是通用類宝穗、英文單詞類户秤、判斷類、編碼類逮矛、以及其他類鸡号,今天先介紹一下通用類的相關(guān)操作。

通用類

  • replace(old, new [, max])须鼎,把 將字符串中的 old 替換成 new, max 為可選參數(shù)鲸伴,若指定 max ,則替換 max 次晋控。

    # 使用語(yǔ)法:str.replace(old, new[, max])
    # 用法一:不指定 max 挑围,替換所有
    >>> double_str = "my name is kele kele"
    >>> double_str.replace("kele", "xuebi")
    'my name is xuebi xuebi'
    
    # 用法二:指定 max ,替換 max 次
    >>> double_str.replace("kele", "xuebi", 1)
    'my name is xuebi xuebi'
    
  • split(str="", num=string.count(str))糖荒,以 str 為分隔符截取字符串杉辙,默認(rèn)為所有的空字符,包括空格捶朵、換行\n蜘矢、制表符\t等。若指定 num 综看,則截取出 num+1 個(gè)子字符串品腹,返回包含所有字符串的列表。

    # 使用語(yǔ)法:str.split(str="", num=string.count(str))
    # 用法一:不指定 num 红碑,截取所有
    >>> double_str = "mynameiskelekelea"
    >>> double_str.split("e")
    ['mynam', 'isk', 'l', 'k', 'l', 'a']
    
    # 用法二:指定 num 舞吭,截取 num 次
    >>> double_str.split("e", 1)
    ['mynam', 'iskelekelea']
    
  • splitlines([keepends])泡垃,按照行('\r', '\r\n', \n')分隔,返回一個(gè)包含各行作為元素的列表羡鸥,參數(shù) keepends 默認(rèn)為 False蔑穴,不包含換行符,如果為 True惧浴,則保留換行符存和。

    # 使用語(yǔ)法:str.splitlines([keepends])
    # 用法一:不指定 keepends,默認(rèn)為 False
    >>> double_str = "my name\nis ke\rle\r\n"
    >>> double_str.splitlines()
    ['my name', 'is ke', 'le']
    
    # 用法一:指定 keepends 為 True, 保留切割符
    >>> double_str.splitlines(True)
    ['my name\n', 'is ke\r', 'le\r\n']
    
  • len(string)衷旅,返回字符串的長(zhǎng)度捐腿。

    # 使用語(yǔ)法:len(string)
    >>> double_str = "my name is kele"
    >>> len(double_str)
    15 
    
  • find(str, beg=0, end=len(string)),檢測(cè) str 是否包含在字符串中柿顶,若指定 beg 和 end 茄袖,則在指定范圍內(nèi)檢測(cè),若包含則返回第一次出現(xiàn)的索引值嘁锯,否則返回 -1绞佩。

    # 使用語(yǔ)法:str.find(str, beg=0, end=len(string))
    >>> double_str = "my name is kele"
    >>> double_str.find("h")
    -1
    >>> double_str.find("e")
    6
    # 指定范圍
    >>> double_str.find("i",0猪钮,5)
    -1
    
  • rfind(str, beg=0,end=len(string))品山,與 find() 函數(shù)類似,但它是從右邊開始查找烤低,返回字符串最后一次出現(xiàn)的索引值肘交。

    # 使用語(yǔ)法:str.rfind(str, beg=0, end=len(string))
    >>> double_str = "my name is kele"
    >>> double_str.rfind("h")
    -1
    >>> double_str.rfind("e")
    14
    # 指定范圍
    >>> double_str.rfind("i",0扑馁,5)
    -1
    
  • index(str, beg=0, end=len(string))涯呻,與 find() 函數(shù)類似,但如果 str 不在字符串中會(huì)報(bào)如下錯(cuò)誤腻要。

    # 使用語(yǔ)法:str.index(str, beg=0, end=len(string))
    >>> double_str = "my name is kele"
    >>> double_str.index("h")      # 元素不在字符串中回報(bào)錯(cuò)
    Traceback (most recent call last):
      File "<input>", line 1, in <module>
    ValueError: substring not found
    
    >>> double_str.index("e")
    6
    # 指定范圍
    >>> double_str.index("a"复罐,0,5)
    4
    
  • rindex( str, beg=0, end=len(string))雄家,類似于 index()效诅,不過(guò)是從右邊開始,返回字符串最后一次出現(xiàn)的索引值趟济。

    # 使用語(yǔ)法:str.rindex(str, beg=0, end=len(string))
    >>> double_str = "my name is kele"
    >>> double_str.rindex("h")      # 元素不在字符串中回報(bào)錯(cuò)
    Traceback (most recent call last):
      File "<input>", line 1, in <module>
    ValueError: substring not found
    
    >>> double_str.rindex("e")
    14
    # 指定范圍
    >>> double_str.rindex("a"乱投,0,5)
    4
    
  • count(str, beg= 0,end=len(string))顷编,返回 str 在 string 中出現(xiàn)的次數(shù)戚炫,若指定 beg 或者 end 參數(shù),則返回在指定范圍內(nèi) str 出現(xiàn)的次數(shù)媳纬。

    # 使用語(yǔ)法:str.count(str, beg=0, end=len(string))
    >>> double_str = "my name is kele"
    >>> double_str.count("h")
    0
    >>> double_str.count("e")
    3
    # 指定范圍
    >>> double_str.count("e"双肤,0施掏,7)
    1
    
  • lstrip([chars]),只處理字符串句首的空格或指定字符茅糜,其他位置忽略七芭。

    # 使用語(yǔ)法:str.lstrip([chars\)
    # 處理句首空格
    >>> double_str = "  句首 有兩個(gè)空格"
    >>> double_str.lstrip()     
    '句首 有兩個(gè)空格'
    
    # 處理句首指定字符
    >>> double_str = "句首句首有一個(gè)空格"
    >>> double_str.lstrip("句首")     
    '有一個(gè)空格'
    
  • rstrip([chars]),處理字符串末尾的空格或指定字符限匣,其他位置忽略 抖苦。

    # 使用語(yǔ)法:str.rstrip([chars])
    # 處理句尾空格
    >>> double_str = "句子末尾 有兩個(gè)空格  "
    >>> double_str.rstrip()     
    '句子末尾 有兩個(gè)空格'
    
    # 處理句尾其他字符
    >>> double_str = "句尾有一個(gè)空格空格"
    >>> double_str.rstrip("空格")     
    '句尾有一個(gè)'
    
  • strip([chars])毁菱, 處理字符串兩端的空格或指定字符米死,可視為 lstrip() 和 rstrip() 的效果疊加。

    # 使用語(yǔ)法:str.strip([chars])
    # 處理兩端的空格
    >>> double_str = " 句首 句尾均有空格 "
    >>> double_str.strip()     
    '句首 句尾均有空格'
    
    # 處理兩端的指定字符
    >>> double_str = "你好有一個(gè) 空格你好"
    >>> double_str.strip("你好")     
    '有一個(gè) 空格'
    
  • center(width, fillchar)贮庞,fillchar 為填充的字符峦筒,默認(rèn)使用空格填充,返回指定寬度 width窗慎、原字符串居中物喷、使用 fillchar 填充后的字符串。

    # 使用語(yǔ)法:str.center(width, fillchar)
    # 用法一:不指定填充字符遮斥,默認(rèn)使用空字符填充
    >>> double_str = "我想通過(guò)兩側(cè)填充來(lái)讓自己變強(qiáng)"
    >>> double_str.center(20)     
    '   我想通過(guò)兩側(cè)填充來(lái)讓自己變強(qiáng)   '
    
    # 用法二:指定填充字符 【*】 
    >>> double_str.center(20峦失,"*")  
    '***我想通過(guò)兩側(cè)填充來(lái)讓自己變強(qiáng)***'
    
  • ljust(width, fillchar)),fillchar 為填充的字符术吗,默認(rèn)使用空格填充尉辑,返回指定寬度 width、原字符串左對(duì)齊较屿、使用 fillchar 填充后的字符串隧魄。

    # 使用語(yǔ)法:str.ljust(width, fillchar)
    # 用法一:不指定填充字符,默認(rèn)使用空字符
    >>> double_str = "我想通過(guò)右側(cè)填充讓自己變強(qiáng)"
    >>> double_str.ljust(20)     
    '我想通過(guò)右側(cè)填充讓自己變強(qiáng)       '
    
    # 用法二:指定填充字符 【*】 
    >>> double_str.ljust(20隘蝎,"*")  
    '我想通過(guò)右側(cè)填充讓自己變強(qiáng)*******'
    
  • rjust(width, fillchar)购啄,fillchar 為填充的字符,默認(rèn)使用空格填充嘱么,返回指定寬度 width狮含、原字符串靠右對(duì)齊、使用 fillchar 填充后的字符串曼振。

    # 使用語(yǔ)法:str.rjust(width, fillchar)
    # 用法一:不指定填充字符辉川,默認(rèn)使用空字符
    >>> double_str = "我想通過(guò)左側(cè)填充讓自己變強(qiáng)"
    >>> double_str.rjust(20)     
    '       我想通過(guò)左側(cè)填充讓自己變強(qiáng)'
    
    # 用法二:指定填充字符 【*】 
    >>> double_str.rjust(20,"*")  
    '*******我想通過(guò)左側(cè)填充讓自己變強(qiáng)'
    
  • zfill (width)拴测,返回長(zhǎng)度為 width 的字符串乓旗,原字符串右對(duì)齊,前面使用 0 填充集索。

    # 使用語(yǔ)法:str.zfill (width)
    >>> double_str = "我想通過(guò)0填充讓自己變強(qiáng)"
    >>> double_str.zfill(20)     
    '00000000我想通過(guò)0填充讓自己變強(qiáng)'
    
  • join(seq)屿愚,以指定字符串作為拼接字符汇跨,將 seq 中所有的元素(必須是字符串類型),拼接為一個(gè)新的字符串妆距。

    # 使用語(yǔ)法:"[chars]".join(seq)
    # 嘗試:拼接對(duì)象包含非字符串類型會(huì)報(bào)錯(cuò)
    >>> seq_list =["我想", "合并", "自己", 1] 
    >>> "".join(seq_list)
    Traceback (most recent call last):
      File "<input>", line 1, in <module>
    TypeError: sequence item 3: expected str instance, int found
    
    # 用法一:不指定拼接字符穷遂,默認(rèn)使用空字符
    >>> seq_list =["我想", "合并", "自己"] 
    >>> "".join(seq_list)     
    '我想合并自己'
    
    # 用法二:指定拼接字符【***】
    >>> "***".join(seq_list)     
    '我想***合并***自己'
    
  • maketrans(input, out),創(chuàng)建字符映射的轉(zhuǎn)換表娱据,第一個(gè)字符串參數(shù)蚪黑,表示需要轉(zhuǎn)換的字符,第二個(gè)字符串參數(shù)表示轉(zhuǎn)換的目標(biāo)中剩。

    # 使用語(yǔ)法:str.maketrans(input, out)
    # 注意:兩個(gè)字符串的長(zhǎng)度必須相同忌穿,否則會(huì)報(bào)如下錯(cuò)誤。
    >>> input_str = "預(yù)備開始结啼,1234567"
    >>> out_str = "哆來(lái)咪發(fā)唆啦西"
    >>> tran_str = str.maketrans(input_str, out_str)
    Traceback (most recent call last):
      File "<input>", line 1, in <module>
    ValueError: the first two maketrans arguments must have equal length
    
    # 正確的使用方式
    >>> input_str = "1234567"
    >>> out_str = "哆來(lái)咪發(fā)唆啦西"
    >>> tran_str = str.maketrans(input_str, out_str)
    >>> waiter_tran = "預(yù)備開始掠剑,1234567"
    >>> waiter_tran.translate(tran_str)
    '預(yù)備開始,哆來(lái)咪發(fā)唆啦西'
    

總結(jié)

  1. 通用類自建函數(shù)中郊愧, replace朴译、join、strip属铁、count眠寿、split、index焦蘑、len盯拱、find 比較常用。

  2. 通用類自建函數(shù)支持鏈?zhǔn)秸{(diào)用喇肋,如處理字符串中空字符串和換行符坟乾,我們先使用 replace 處理空字符串,再使用 strip 處理?yè)Q行符蝶防,可直接在后面使用.鏈?zhǔn)秸{(diào)用甚侣。

    >>> double_str = " 我是等待鏈?zhǔn)?調(diào)用處理的字符串 \n"
    >>> double_str.replace(" ", "").strip()
    '我是等待鏈?zhǔn)秸{(diào)用處理的字符串'
    
  3. index、find 效果是一樣的间学,但是 find 有容錯(cuò)機(jī)制殷费,使用時(shí)優(yōu)先選擇。

  4. 今天先介紹通用類自建函數(shù)的相關(guān)操作低葫,后續(xù)將介紹其他類函數(shù)的相關(guān)操作详羡。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市嘿悬,隨后出現(xiàn)的幾起案子实柠,更是在濱河造成了極大的恐慌,老刑警劉巖善涨,帶你破解...
    沈念sama閱讀 212,080評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件窒盐,死亡現(xiàn)場(chǎng)離奇詭異草则,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)蟹漓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,422評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門炕横,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人葡粒,你說(shuō)我怎么就攤上這事份殿。” “怎么了嗽交?”我有些...
    開封第一講書人閱讀 157,630評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵卿嘲,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我轮纫,道長(zhǎng)腔寡,這世上最難降的妖魔是什么焚鲜? 我笑而不...
    開封第一講書人閱讀 56,554評(píng)論 1 284
  • 正文 為了忘掉前任掌唾,我火速辦了婚禮,結(jié)果婚禮上忿磅,老公的妹妹穿的比我還像新娘糯彬。我一直安慰自己,他們只是感情好葱她,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,662評(píng)論 6 386
  • 文/花漫 我一把揭開白布撩扒。 她就那樣靜靜地躺著,像睡著了一般吨些。 火紅的嫁衣襯著肌膚如雪搓谆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,856評(píng)論 1 290
  • 那天豪墅,我揣著相機(jī)與錄音泉手,去河邊找鬼。 笑死偶器,一個(gè)胖子當(dāng)著我的面吹牛斩萌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播屏轰,決...
    沈念sama閱讀 39,014評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼颊郎,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了霎苗?” 一聲冷哼從身側(cè)響起姆吭,我...
    開封第一講書人閱讀 37,752評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎唁盏,沒(méi)想到半個(gè)月后内狸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瘤睹,經(jīng)...
    沈念sama閱讀 44,212評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,541評(píng)論 2 327
  • 正文 我和宋清朗相戀三年答倡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了轰传。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,687評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡瘪撇,死狀恐怖获茬,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情倔既,我是刑警寧澤恕曲,帶...
    沈念sama閱讀 34,347評(píng)論 4 331
  • 正文 年R本政府宣布,位于F島的核電站渤涌,受9級(jí)特大地震影響佩谣,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜实蓬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,973評(píng)論 3 315
  • 文/蒙蒙 一茸俭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧安皱,春花似錦调鬓、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,777評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至居砖,卻和暖如春虹脯,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背奏候。 一陣腳步聲響...
    開封第一講書人閱讀 32,006評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工循集, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鼻由。 一個(gè)月前我還...
    沈念sama閱讀 46,406評(píng)論 2 360
  • 正文 我出身青樓暇榴,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親蕉世。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蔼紧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,576評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容