官术网_书友最值得收藏!

5.1 字符串的常用操作

微視頻

前面章節(jié)中已經(jīng)講述了創(chuàng)建字符串的方法,本節(jié)開(kāi)始講解字符串的常用操作。

5.1.1 拼接字符串

使用加號(hào)(+)運(yùn)算符可以將兩個(gè)字符串連接起來(lái),成為一個(gè)新的字符串。例如:

    >>>x="昔去景風(fēng)涉,今來(lái)姑洗至。"
    >>>y="觀此得詠歌,長(zhǎng)時(shí)想精異。"
    >>>z=x + y
    >>>print(z)
    昔去景風(fēng)涉,今來(lái)姑洗至。觀此得詠歌,長(zhǎng)時(shí)想精異。

大牛提醒

如果字符串和其他類型的數(shù)據(jù)拼接,將會(huì)報(bào)錯(cuò)。例如,將字符串和浮點(diǎn)型數(shù)據(jù)拼接在一起,將會(huì)報(bào)錯(cuò)。

    >>>s1="我今天購(gòu)買的蘋果價(jià)格是"
    >>>num=8.6
    >>>s2="元每千克。"
    >>>print(s1+num+s2)
    Traceback (most recent call last):
      File "<pyshell#7>", line 1, in <module>
        print(s1+num+s2)
    TypeError: can only concatenate str (not "float") to str

如果想解決上面的問(wèn)題,可以使用srt()函數(shù)將浮點(diǎn)型數(shù)據(jù)轉(zhuǎn)換成字符串即可。

    >>>print(s1+str(num)+s2)
    我今天購(gòu)買的蘋果價(jià)格是8.6元每千克。

5.1.2 計(jì)算字符串的長(zhǎng)度

在計(jì)算字符串長(zhǎng)度之前,用戶需要理解每個(gè)字符所占的字節(jié)數(shù)。在Python語(yǔ)言中,數(shù)字、英文、小數(shù)點(diǎn)、下畫線和空格各占1字節(jié)。漢字可能會(huì)占2~4字節(jié),占幾字節(jié)取決于采用的編碼。由于Python語(yǔ)言默認(rèn)采用UTF-8編碼,所以漢字占有3字節(jié)。

大牛提醒

漢字在GBK/GB 2312編碼中占2字節(jié),在UTF-8/Unicode編碼中一般占3字節(jié)或4字節(jié)。

Python語(yǔ)言通過(guò)len()函數(shù)計(jì)算字符串的長(zhǎng)度,語(yǔ)法格式如下:

    Len(string)

其中,string是需要計(jì)算長(zhǎng)度的字符串。例如下面的例子:

    >>>s1="我今天需要參加English 考試。"  #定義包含英文、中文和中文標(biāo)點(diǎn)符號(hào)的字符串
    >>>ls = len(s1)                       #計(jì)算字符串的長(zhǎng)度
    >>>ls
    17

從結(jié)果可以看出,len()函數(shù)在計(jì)算字符串長(zhǎng)度時(shí),沒(méi)有區(qū)分英文和中文,統(tǒng)統(tǒng)按一個(gè)字符計(jì)算。如果用戶需要獲取字符串實(shí)際所占的字節(jié)數(shù),就需要指定編碼,然后才能獲取實(shí)際的長(zhǎng)度。由于Python語(yǔ)言默認(rèn)采用UTF-8,可以通過(guò)encode()方法進(jìn)行編碼后再進(jìn)行獲取。

例如,對(duì)上面的例子進(jìn)行如下修改:

    >>>s1="我今天需要參加English 考試。"  #定義包含英文、中文和標(biāo)點(diǎn)符號(hào)的字符串
    >>>ls = len(s1.encode())              #計(jì)算UTF-8編碼的字符串的長(zhǎng)度
    >>>ls
    37

結(jié)果輸出為37。字符串中有9個(gè)漢字和1個(gè)中文標(biāo)點(diǎn)符號(hào),占30字節(jié),英文有7個(gè),占7字節(jié),所以結(jié)果為37。

5.1.3 截取字符串

與列表的索引一樣,字符串索引從0開(kāi)始。例如,字符串hello在Python內(nèi)部被視為h、e、l、l、o 5個(gè)字符的組合。因?yàn)榈?個(gè)字符的索引值永遠(yuǎn)是0,所以存取字符串hello的第1個(gè)字符h時(shí)使用"hello"[0]。例如:

    >>> "hello"[0]
    'h'
    >>> "hello"[2]
    'l'

字符串的索引值可以為負(fù)值。若索引值為負(fù)數(shù),則表示由字符串的結(jié)尾向前數(shù)。字符串的最后一個(gè)字符其索引值是-1,字符串的倒數(shù)第二個(gè)字符其索引值是-2。例如:

    >>>"hello"[-1]
    'o'
    >>>"hello"[-2]
    'l'

Python語(yǔ)言程序中訪問(wèn)子字符串變量,可以使用中括號(hào)([])和冒號(hào)(:)來(lái)截取字符串。使用方法如下:

    a[x:y]

這里表示截取字符串a(chǎn),中括號(hào)([])內(nèi)的第1個(gè)數(shù)字x是要截取字符串的開(kāi)始索引值,第2個(gè)數(shù)字y則是要截取字符串的結(jié)尾索引值。

大牛提醒

這里截取的字符串只包含以第1個(gè)數(shù)字x為索引值的字符,而不包含以第2個(gè)數(shù)字y為索引值的字符。例如:

    >>>s1="我今天需要參加English 考試。"   #定義包含英文、中文和中文標(biāo)點(diǎn)符號(hào)的字符串
    >>>s1[0:6]                             #從左邊開(kāi)始截取6個(gè)字符
    '我今天需要參'
    >>>s1[:4]                              #從左邊開(kāi)始截取4個(gè)字符
    '我今天需'
    >>>s1[3:6]                             #截取第4個(gè)到第6個(gè)字符
    '需要參'
    >>>s1[1:]                              #截取第2個(gè)到最后一個(gè)字符
    '今天需要參加English 考試。'
    >>>s1[:]                               #獲取全部的字符
    '我今天需要參加English 考試。'

大牛提醒

截取字符串時(shí),需要注意的問(wèn)題如下:

如果省略開(kāi)始索引值,截取字符串就由第一個(gè)字符到結(jié)尾索引值

如果省略結(jié)尾索引值,截取字符串就由開(kāi)始索引值到最后一個(gè)字符。

如果同時(shí)省略開(kāi)始索引值與結(jié)尾索引值,截取字符串由第一個(gè)字符到最后一個(gè)字符。

【例5.1】根據(jù)輸入的身份證號(hào)獲取出生日期(源代碼\ch05\5.1.py)。

    print ("歡迎進(jìn)入出生日期查詢系統(tǒng)\n")
    num= input("請(qǐng)輸入您的身份證號(hào):")     #輸入身份證號(hào)
    y = num[6:10]                          #截取出生年份
    m = num[10:12]                         #截取出生月份
    d = num[12:14]                         #截取出生日期
    print ("您的出生日期是:"+y+"年"+m+"月"+d+"日")

程序運(yùn)行結(jié)果如圖5-1所示。

圖5-1 例5.1的程序運(yùn)行結(jié)果

5.1.4 分割和合并字符串

1.分割字符串

在python語(yǔ)言中,split()方法通過(guò)指定分隔符對(duì)字符串進(jìn)行分割(切片)。該方法的語(yǔ)法格式如下:

    str.split(str="", num=string.count(str))

其中,參數(shù)str用于指定分隔符,默認(rèn)為所有的空字符,包括空格、換行(\n)、制表符(\t)等;num為分割的次數(shù)。默認(rèn)值為-1,即分隔所有。該方法將返回分割后的字符串列表。

例如下面的例子。

    >>>s2="Experience is the mother of wisdom"
    >>>print (s2.split( ))                    #以空格為分隔符
    ['Experience', 'is', 'the', 'mother', 'of', 'wisdom']
    >>>print (s2.split('i',2))                #以i 為分隔符,分割兩次
    ['Exper', 'ence ', 's the mother of wisdom']
    >>>print (s2.split('m'))                  #以 m 為分隔符
    ['Experience is the ', 'other of wisdo', '']

大牛提醒

在solit()中,如果不指定參數(shù),則默認(rèn)采用空格符進(jìn)行分割。如果出現(xiàn)各個(gè)空格或者空白符,都將作為一個(gè)分隔符進(jìn)行分割。

【例5.2】輸出被標(biāo)星的好友(源代碼\ch05\5.2.py)。

    s1 = "*張三豐*李一真*陶淵明*李白"
    ls= s1.split( )                    #以空格為分隔符
    print ("您的標(biāo)星好友是:")
    for im in ls:
    print(im[1:])                      #輸出每個(gè)好友時(shí),去掉*符號(hào)

程序運(yùn)行結(jié)果如圖5-2所示。

圖5-2 例5.2的程序運(yùn)行結(jié)果

2.合并字符串

在Python語(yǔ)言中,join()方法用于將序列中的元素以指定的字符合并(連接)生成一個(gè)新的字符串。

join()方法的語(yǔ)法格式如下:

    str.join(sequence)

其中,sequence為要合并的元素序列。

例如:

    >>>s1 =" "
    >>>s2 ="*"
    >>>s3 ="#"
    #字符串序列
    >>>e1=("黃", "沙", "百", "戰(zhàn)", "穿", "金", "甲")
    >>>e2=("不", "破", "樓", "蘭", "終", "不", "還")
    >>> print (s1.join( e1 ))
    黃沙  百 戰(zhàn) 穿 金 甲
    >>> print (s2.join( e2 ))
    不*破*樓*蘭*終*不*還
    >>> print (s3.join( e2 ))
    不#破#樓#蘭#終#不#還

注意:被合并的元素必須是字符串,如果是其他的數(shù)據(jù)類型,運(yùn)行時(shí)就會(huì)報(bào)錯(cuò)。

5.1.5 檢索字符串

Python提供了很多檢索字符串的方法。下面挑選一些常用的方法進(jìn)行講解。

1.count()方法

count()方法用于統(tǒng)計(jì)字符串里某個(gè)字符出現(xiàn)的次數(shù),可選參數(shù)為在字符串搜索的開(kāi)始與結(jié)束位置。

count()方法的語(yǔ)法格式如下:

    str.count(sub, start= 0,end=len(string))

其中,sub為搜索的子字符串;start為字符串開(kāi)始搜索的位置,默認(rèn)為第一個(gè)字符,第一個(gè)字符的索引值為0;end為字符串中結(jié)束搜索的位置,默認(rèn)為字符串的最后一個(gè)位置。

例如:

    >>>str="The best preparation for tomorrow is doing your best today"
    >>>s='b'
    >>> print ("字符b 出現(xiàn)的次數(shù)為: ", str.count(s))
    字符b 出現(xiàn)的次數(shù)為:  2
    >>> s='best'
    >>> print ("best 出現(xiàn)的次數(shù)為:", str.count(s,0,6))
    best 出現(xiàn)的次數(shù)為: 0
    >>> print ("best 出現(xiàn)的次數(shù)為:", str.count(s,0,40))
    best 出現(xiàn)的次數(shù)為: 1
    >>> print ("best 出現(xiàn)的次數(shù)為:", str.count(s,0,80))
    best 出現(xiàn)的次數(shù)為: 2
2.find()方法

find()方法檢測(cè)字符串中是否包含子字符串。如果包含子字符串,就返回開(kāi)始的索引值;否則就返回-1。

find()方法的語(yǔ)法格式如下:

    str.find(str, beg=0, end=len(string)

其中,str為指定檢索的字符串;beg為開(kāi)始索引,默認(rèn)為0;end為結(jié)束索引,默認(rèn)為字符串的長(zhǎng)度。例如:

    >>> str1 = "青海長(zhǎng)云暗雪山,孤城遙望玉門關(guān)。"
    >>> str2 = "玉門"
    >>> print (str1.find(str2))
    12
    >>> print (str1.find(str2,10))
    12
    >>> print (str1.find(str2,13,15))
    -1
3.index()方法

index()方法檢測(cè)字符串中是否包含子字符串。如果包含子字符串,就返回開(kāi)始的索引值,否則就會(huì)報(bào)一個(gè)異常。

index()方法的語(yǔ)法格式如下:

    str.index(str, beg=0, end=len(string))

其中,str為指定檢索的字符串;beg為開(kāi)始索引,默認(rèn)為0;end為結(jié)束索引,默認(rèn)為字符串的長(zhǎng)度。例如:

    >>>str1 = "青海長(zhǎng)云暗雪山,孤城遙望玉門關(guān)。"
    >>>str2 = "玉門"
    >>> print (str1.index(str2))
    12
    >>> print (str1.index (str2,10))
    12
    >>> print (str1.index(str2,13,15))
    Traceback (most recent call last):
      File "<pyshell#32>", line 1, in <module>
        print (str1.index(str2,13,15))
    ValueError: substring not found

可見(jiàn),該方法與find()方法一樣,只不過(guò)如果str不在string中,就會(huì)報(bào)一個(gè)異常。

5.1.6 字母的大小寫轉(zhuǎn)換

low ()方法將字符串中的所有大寫字母轉(zhuǎn)換為小寫字母。其語(yǔ)法格式如下:

    str.lower()

其中,str為指定需要轉(zhuǎn)換的字符串,該方法沒(méi)有參數(shù)。

例如:

    >>>s1 ="A GREAT SHIP ASKS FOR DEEP WATERS"
    >>>print('使用low()方法后的效果:',s1.lower())
    使用low()方法后的效果:  a great ship asks for deep waters

從結(jié)果可以看出,字符串中的大寫字母全部轉(zhuǎn)換為小寫字母了。

【例5.3】實(shí)現(xiàn)“不區(qū)分大小寫”功能(源代碼\ch05\5.3.py)。

在一個(gè)字符串中查找某個(gè)子字符串并忽略其大小寫,這里需要使用lower()方法。

    s1 = "A great Ship asks for deep waters"
    s2 = "sH"
    print(s1.find(s2))                        #都不轉(zhuǎn)換為小寫,找不到匹配的字符串
    print(s1.lower().find(s2))                #被查找字符串轉(zhuǎn)換為小寫,找不到匹配的字符串
    print(s1.lower().find(s2.lower()))        #全部轉(zhuǎn)換為小寫,找到匹配的字符串

程序運(yùn)行結(jié)果如圖5-3所示。

圖5-3 例5.3的程序運(yùn)行結(jié)果

結(jié)果為-1,表示沒(méi)有找到對(duì)應(yīng)的字符串;結(jié)果為8,表示從字符串的第9個(gè)位置找到對(duì)應(yīng)的字符串。可見(jiàn),字符串中的大寫字母全部轉(zhuǎn)換為小寫字母后,即可匹配到對(duì)應(yīng)的子字符串。

upper()方法將字符串中的所有小寫字母轉(zhuǎn)換為大寫字母。

upper()方法的語(yǔ)法格式如下:

    str.upper()

其中,str為指定需要轉(zhuǎn)換的字符串,該方法沒(méi)有參數(shù)。

例如:

    >>>s2 ="A great ship asks for deep waters"
    >>>print('使用upper()方法后的效果:',s2.upper())          #全部轉(zhuǎn)換為大寫字母輸出
    使用upper()方法后的效果: A GREAT SHIP ASKS FOR DEEP WATERS

5.1.7 刪除字符串中的空格和特殊字符

在處理字符串時(shí),經(jīng)常需要?jiǎng)h除多余的空格和特殊字符。在Python語(yǔ)言中,通過(guò)一些內(nèi)置方法即可輕松處理字符串中的空格和特殊字符。下面將詳細(xì)講述這些方法。

1.strip()方法

strip()方法用于刪除字符串頭尾指定的字符或字符序列。注意:該方法只能刪除開(kāi)頭或結(jié)尾的字符,不能刪除中間部分的字符。

strip()方法的語(yǔ)法格式如下:

    str.strip([chars])

參數(shù)chars是需要?jiǎng)h除的字符序列,默認(rèn)情況是空格。該方法的返回值為刪除指定字符序列后生成的新字符串。

    >>>str = "*****茅檐**低小**,溪上青青草。*****"
    >>>print (str.strip( '*' ))                      #指定字符串 *
    茅檐**低小**,溪上青青草。

從結(jié)果可以看出,strip()方法只刪除了開(kāi)頭和結(jié)尾處的*號(hào),并沒(méi)有刪除中間部分的*號(hào)。

    >>>str = "       茅檐  低小  ,溪上青青草。  "
    >>>str.strip()     #不指定刪除的字符串
    '茅檐  低小  ,溪上青青草。'

從結(jié)果可以看出,當(dāng)不指定刪除字符時(shí),則默認(rèn)刪除開(kāi)頭和結(jié)尾處的空格。

2.lstrip()方法

lstrip()方法用于截掉字符串左邊的空格或指定字符。lstrip()方法的語(yǔ)法格式如下:

    str.lstrip([chars])

參數(shù)chars是需要?jiǎng)h除的字符序列,默認(rèn)情況是空格。該方法的返回值為截掉字符串左邊的空格或指定字符后生成的新字符串。

    >>>str = "*****茅檐**低小**,溪上青青草。*****"
    >>>print (str.lstrip( '*' ))  #指定字符串       *
    茅檐**低小**,溪上青青草。*****

從結(jié)果可以看出,lstrip()方法刪除了開(kāi)頭處的*號(hào),并沒(méi)有刪除中間和結(jié)尾部分的*號(hào)。

    >>>str = "       茅檐  低小  ,溪上青青草。  "
    >>>str.lstrip()     #不指定刪除的字符串
    '茅檐  低小  ,溪上青青草。     '

從結(jié)果可以看出,當(dāng)不指定刪除字符時(shí),則默認(rèn)刪除開(kāi)頭處的空格。

3.rstrip()方法

rstrip()方法刪除字符串末尾的指定字符(默認(rèn)為空格)。rstrip()方法的語(yǔ)法格式如下:

    str.rstrip([chars])

參數(shù)chars是需要?jiǎng)h除的字符序列,默認(rèn)情況是空格。該方法的返回值為截掉字符串右邊的空格或指定字符后生成的新字符串。

    >>>str = "*****茅檐**低小**,溪上青青草。*****"
    >>>print (str.rstrip( '*' ))     #指定字符串       *
    *****茅檐**低小**,溪上青青草。

從結(jié)果可以看出,rstrip()方法刪除了結(jié)尾處的*號(hào),并沒(méi)有刪除中間和開(kāi)頭部分的*號(hào)。

    >>>str = "       茅檐  低小  ,溪上青青草。  "
    >>>str.rstrip()    #不指定刪除的字符串
    '     茅檐  低小  ,溪上青青草。'

從結(jié)果可以看出,當(dāng)不指定刪除字符時(shí),則默認(rèn)刪除結(jié)尾處的空格。

5.1.8 使用Python的轉(zhuǎn)義字符

有時(shí)候需要在字符串內(nèi)設(shè)置單引號(hào)、雙引號(hào)、換行符等,可使用轉(zhuǎn)義字符。Python的轉(zhuǎn)義字符是由一個(gè)反斜杠(\)與一個(gè)字符組成,如表5-1所示。

表5-1 Python的轉(zhuǎn)義字符

下面挑選幾個(gè)常用的轉(zhuǎn)義字符進(jìn)行講解。

1.換行字符(\n)

下面的案例是在字符串內(nèi)使用換行字符:

    >>>a="千載長(zhǎng)天起大云,中唐俊偉有劉蕡。\n 孤鴻鎩羽悲鳴鏑,萬(wàn)馬齊喑叫一聲。"
    >>>print(a)
    千載長(zhǎng)天起大云,中唐俊偉有劉蕡。
    孤鴻鎩羽悲鳴鏑,萬(wàn)馬齊喑叫一聲。
2.雙引號(hào)(\")

下面的案例是在字符串內(nèi)使用雙引號(hào):

    >>>a="高爾基說(shuō):\"讀的書愈多,就愈親近世界,愈明了生活的意義,愈覺(jué)得生活的重要。\""
    >>>print (a)
    高爾基說(shuō):"讀的書愈多,就愈親近世界,愈明了生活的意義,愈覺(jué)得生活的重要。"
3.各進(jìn)制的ASCII碼

下面的案例是顯示十六進(jìn)制數(shù)值是55的ASCII碼:

    >>> a="\x55"
    >>> a
    'U'

下面的案例是顯示八進(jìn)制數(shù)值是106的ASCII碼:

    >>> a= "\106"
    >>> a
    'F'
4.加入反斜杠字符(\\)

如果需要在字符串內(nèi)加上反斜杠字符,可以在反斜杠符號(hào)前多加一個(gè)反斜杠符號(hào),例如:下面的案例中字符串包含反斜杠字符。

    >>> print ("\\d")
    \d
    >>> print (R"\e,\f,\e")
    \e,\f,\e
主站蜘蛛池模板: 万安县| 砚山县| 普定县| 崇阳县| 宣威市| 嘉禾县| 西盟| 东阿县| 固始县| 临高县| 西青区| 永泰县| 沙洋县| 兴山县| 巴塘县| 淮北市| 商城县| 台前县| 济南市| 永宁县| 镇康县| 横山县| 屏边| 灵寿县| 乾安县| 滕州市| 巢湖市| 余姚市| 盐山县| 阿拉善右旗| 依安县| 延长县| 泰和县| 银川市| 阿城市| 西丰县| 彰化县| 恩施市| 长治市| 安新县| 犍为县|