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

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

前言

Python3 中有六個(gè)標(biāo)準(zhǔn)的數(shù)據(jù)類(lèi)型,它們分別是數(shù)字(Number)、字符串(String)、列表(List)、元組(Tuple)、集合(Set)、字典(Dictionary)。

數(shù)據(jù)類(lèi)型分類(lèi)可變數(shù)據(jù)類(lèi)型、和不可變數(shù)據(jù)類(lèi)型,其中可變類(lèi)型包括列表、字典、集合,不可變類(lèi)型包括數(shù)字、字符串、元組。

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


字符串簡(jiǎn)介

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

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

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

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

字符串操作

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

通用類(lèi)

  • 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ù)類(lèi)似,但它是從右邊開(kāi)始查找,返回字符串最后一次出現(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ù)類(lèi)似,但如果 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)),類(lèi)似于 index(),不過(guò)是從右邊開(kāi)始,返回字符串最后一次出現(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 中所有的元素(必須是字符串類(lèi)型),拼接為一個(gè)新的字符串。

    # 使用語(yǔ)法:"[chars]".join(seq)
    # 嘗試:拼接對(duì)象包含非字符串類(lèi)型會(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ù)備開(kāi)始,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ù)備開(kāi)始,1234567"
    >>> waiter_tran.translate(tran_str)
    '預(yù)備開(kāi)始,哆來(lái)咪發(fā)唆啦西'
    

總結(jié)

  1. 通用類(lèi)自建函數(shù)中, replace、join、strip、count、split、index、len、find 比較常用。

  2. 通用類(lèi)自建函數(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. 今天先介紹通用類(lèi)自建函數(shù)的相關(guān)操作,后續(xù)將介紹其他類(lèi)函數(shù)的相關(guān)操作。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容