版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第5章字符串與文本分析字符串編碼字符串的索引與分片字符串的操作字節(jié)類型正則表達(dá)式字符串應(yīng)用舉例文本分析1.Unicode碼Unicode編碼標(biāo)準(zhǔn)為表達(dá)全世界所有語言的任意字符而設(shè)計,它使用4字節(jié)的數(shù)字編碼來表達(dá)每個字母、符號或文字。每個數(shù)字編碼代表唯一的至少在某種語言中使用的符號,被幾種語言共用的字符通常使用相同的數(shù)字來編碼,每個字符對應(yīng)一個數(shù)字編碼,每個數(shù)字編碼對應(yīng)一個字符,即不存在二義性。5.1字符串編碼2.UTF-8碼UTF-8是一種為Unicode字符設(shè)計的變長編碼系統(tǒng),即不同的字符可使用不同數(shù)量的字節(jié)編碼。對于ASCII字符,UTF-8僅使用1個字節(jié)來編碼。UTF-8支持中英文編碼,英文系統(tǒng)也可以顯示中文。Python支持UTF-8編碼,中文字符、希臘字母均可以作為標(biāo)識符使用。例如:>>>π=3.14159>>>國家='中國'3.Unicode碼與UTF-8碼的轉(zhuǎn)換在Python中,可以通過字符串的encode()方法從Unicode編碼為指定編碼方式。decode()方法從指定編碼方式解碼為Unicode方式。例如:>>>s='漢字ABC'>>>k=s.encode('utf-8')>>>kb'\xe6\xb1\x89\xe5\xad\x97ABC'>>>k.decode('utf-8')'漢字ABC'5.2.1字符串的索引為了實(shí)現(xiàn)索引,需要對字符串中的字符進(jìn)行編號,最左邊字符編號為0,最右邊字符的編號比字符串的長度小1。Python還支持在字符串中使用負(fù)數(shù)從右向左進(jìn)行編號,最右邊的字符(即倒數(shù)第1個字符)的編號為-1。字符串變量名后接用中括號括起來的編號即可實(shí)現(xiàn)字符串的索引。5.2字符串的索引與分片例如:>>>s="Hello"字符串s中各個字符的索引編號如圖所示。例5-1將一個字符串中的字符按逆序打印出來。分析:先輸出字符串的最后一個字符,且不換行,然后輸出倒數(shù)第2個字符,同樣不換行,一直到第1個字符。利用for循環(huán)控制字符索引編號,循環(huán)賦值目標(biāo)變量從0變化到字符串的長度。取字符串的長度可以利用len()函數(shù)。程序如下:s1=input("Pleaseenterastring:")foriinrange(0,len(s1)):print(s1[len(s1)-1-i],end='')5.2.2字符串的分片字符串的分片就是從給定的字符串中分離出部分字符,這時可以使用以下形式的字符串索引編號。i:j:k其中i是索引起始位置,j是索引結(jié)束位置但不包括j位置上的字符,索引編號每次增加的步長為k。例如:>>>s="HelloWorld!">>>print(s[0:5:2])Hlo>>>s='abcdefg'>>>s[5:1:-1]'fedc'>>>s[-len(s):-1]'abcdef'例5-2利用字符串分片方法將一個字符串中的字符按逆序打印出來。程序如下:s1=input("Pleaseenterastring:")s2=s1[::-1]print(s2)5.3.1字符串連接操作1.基本連接操作字符串表達(dá)式是指用“連接”運(yùn)算符把字符串常量、字符串變量等字符串?dāng)?shù)據(jù)連接起來的有意義的式子,它的一般格式是:s1+s2+……+sn其中s1,s2,……,sn均是一個字符串,表達(dá)式的值也是一個字符串。例如:>>>"Sub"+"string"'Substring'5.3字符串的操作2.重復(fù)連接操作Python提供乘法運(yùn)算符(*),構(gòu)建一個由其自身字符串重復(fù)連接而成的字符串。字符串重復(fù)連接的一般格式是:s*n或n*s其中s是一個字符串;n是一個正整數(shù),代表重復(fù)的次數(shù)。例如:>>>"ABCD"*2'ABCDABCD'例5-3從鍵盤輸入5個字符串,將它們連接成一個字符串后輸出。s=''foriinrange(0,5):c=input("Pleaseenterastring:")s+=cprint(s)3.連接操作的其他實(shí)現(xiàn)對于連接操作,可以用格式化操作符或join()函數(shù)取代,這樣只會有一次內(nèi)存的申請,以提高操作效率。例如:>>>'{:s}{:s}{:s}'.format('Python','','Program')'PythonProgram'>>>''.join(['Python','','Program'])'PythonProgram'5.3.2字符串邏輯操作1.關(guān)系操作在進(jìn)行字符串?dāng)?shù)據(jù)的比較時,遵循以下規(guī)則。(1)單個字符比較,按字符ASCII碼大小進(jìn)行比較。(2)兩個相同長度的字符串的比較是將字符串中的字符從左向右逐個比較,如果所有字符都相等,則兩個字符串相等,如果兩個字符串中有不同的字符,以最左邊的第1對不同字符的比較結(jié)果為準(zhǔn)。(3)若兩個字符串中字符個數(shù)不等時,則將較短的字符串后面補(bǔ)足空格后再比較。例5-4從鍵盤輸入10個英文單詞,輸出其中以元音字母開頭的單詞。分析:輸入一個英文單詞,并進(jìn)行判斷,用for循環(huán)控制重復(fù)執(zhí)行10次。可以將所有元音字母構(gòu)成一個字符串,遍歷該字符串中的各個字符,并判斷單詞的首字母。2.成員關(guān)系操作字符串的成員關(guān)系操作包括in和notin操作,一般格式為:字符串1[not]in字符串2該操作用于判斷字符串1是否屬于字符串2,其返回值為True或False.例如:>>>'a'in'abc'True5.3.3字符串的常用方法函數(shù)可以通過函數(shù)名直接調(diào)用,如ord('A'),而對象中的方法則要通過對象名和方法名來調(diào)用,一般形式為:對象名.方法名(參數(shù))在Python中,字符串類型(String)可以看成是一個類(Class),而一個具體的字符串可以看成是一個對象,該對象具有很多方法,這些方法是通過類的成員函數(shù)來實(shí)現(xiàn)的。1.字母大小寫轉(zhuǎn)換s.upper():全部轉(zhuǎn)換為大寫字母。s.lower():全部轉(zhuǎn)換為小寫字母。s.swapcase():字母大小寫互換。s.capitalize():首字母大寫,其余小寫。s.title():首字母大寫。例5-5字母大小寫轉(zhuǎn)換函數(shù)使用示例。程序如下:s='PythonProgram'print('{:s}lower={:s}'.format(s,s.lower()))print('{:s}upper={:s}'.format(s,s.upper()))print('{:s}swapcase={:s}'.format(s,s.swapcase()))print('{:s}capitalize={:s}'.format(s,s.capitalize()))print('{:s}title={:s}'.format(s,s.title()))2.字符串對齊處理s.ljust(width,[fillchar]):輸出width個字符,s左對齊,右邊不足部分用fillchar填充,默認(rèn)用空格填充。s.rjust(width,[fillchar]):輸出width個字符,s右對齊,左邊不足部分用fillchar填充,默認(rèn)用空格填充。s.center(width,[fillchar])輸出width個字符,s中間對齊,兩邊不足部分用fillchar填充,默認(rèn)用空格填充。s.zfill(width):把s變成width長,并且右對齊,左邊不足部分用0補(bǔ)齊。例5-6字符串對齊處理函數(shù)使用示例。程序如下:s='PythonProgram'print('{:s}ljust={:s}'.format(s,s.ljust(20)))print('{:s}rjust={:s}'.format(s,s.rjust(20)))print('{:s}center={:s}'.format(s,s.center(20)))print('{:s}zfill={:s}'.format(s,s.zfill(20)))3.字符串搜索s.find(substr,[start,[end]]):返回s中出現(xiàn)substr的第1個字符的編號,如果s中沒有substr則返回-1。start和end作用就相當(dāng)于在s[start:end]中搜索。s.index(substr,[start,[end]]):與find()相同,只是在s中沒有substr時,會返回一個運(yùn)行時錯誤。s.rfind(substr,[start,[end]]):返回s中最后出現(xiàn)的substr的第1個字符的編號,如果s中沒有substr則返回-1,也就是說從右邊算起的第1次出現(xiàn)的substr的首字符編號。3.字符串搜索s.rindex(substr,[start,[end]]):與rfind()相同,只是在s中沒有substr時,會返回一個運(yùn)行時錯誤。s.count(substr,[start,[end]]):計算substr在s中出現(xiàn)的次數(shù)。s.startswith(prefix[,start[,end]]):是否以prefix開頭,若是返回True,否則返回False。s.endswith(suffix[,start[,end]]):以suffix結(jié)尾,若是返回True,否則返回False。例5-7字符串搜索函數(shù)使用示例。程序如下:s='PythonProgram'print('{:s}findnono={:d}'.format(s,s.find('nono')))print('{:s}findt={:d}'.format(s,s.find('t')))print('{:s}findtfrom{:d}={:d}'.format(s,1,s.find('t',1)))print('{:s}findtfrom{:d}to{:d}={:d}'.format(s,1,2,s.find('t',1,2)))print('{:s}rfindt={:d}'.format(s,s.rfind('t')))print('{:s}countt={:d}'.format(s,s.count('t')))4.字符串替換s.replace(oldstr,newstr,[count]):把s中的oldstar替換為newstr,count為替換次數(shù)。這是替換的通用形式,還有一些函數(shù)進(jìn)行特殊字符的替換。s.strip([chars]):把s中前后chars中有的字符全部去掉,可以理解為把s前后chars替換為None。默認(rèn)去掉前后空格。s.lstrip([chars]):把s左邊chars中有的字符全部去掉。默認(rèn)去掉左邊空格。s.rstrip([chars]):把s右邊chars中有的字符全部去掉。默認(rèn)去掉右邊空格。s.expandtabs([tabsize]):把s中的tab字符替換為空格,每個tab替換為tabsize個空格,默認(rèn)是8個。例5-8字符串替換函數(shù)使用示例。程序如下:s='PythonProgram'print('{:s}replacetto*={:s}'.format(s,s.replace('t','*')))print('{:s}replacetto*={:s}'.format(s,s.replace('t','*',1)))print('{:s}strip={:s}'.format(s,s.strip()))print('{:s}strip={:s}'.format(s,s.strip('Pm')))5.字符串的拆分與組合s.split([sep,[maxsplit]]):以sep為分隔符,把字符串s拆分成一個列表。默認(rèn)的分隔符為空格。maxsplit表示拆分的次數(shù),默認(rèn)取-1,表示無限制拆分。s.rsplit([sep,[maxsplit]]):從右側(cè)把字符串s拆分成一個列表。s.splitlines([keepends]):把s按行拆分分為一個列表。keepends是一個邏輯值,如果為True,則每行拆分后會保留行分隔符。s.partition(sub):從sub出現(xiàn)的第1個位置起,把字符串s拆分成一個3元素的元組(sub左邊字符,sub,sub右邊字符)。如果s中不包含sub則返回(s,'','')。s.rpartition(sub):從右側(cè)開始,把字符串s拆分成一個3元素的元組(sub左邊字符,sub,sub右邊字符)。如果s中不包含sub則返回('','',s)。s.join(seq):把seq代表的序列組合成字符串,用s將序列各元素連接起來。字符串中的字符是不能修改的,如果要修改,通常的方法是,用list()函數(shù)把字符串s變?yōu)橐詥蝹€字符為成員的列表(使用語句s=list(s)),再使用給列表成員賦值的方式改變值(如s[3]='a'),最后再使用語句“s="".join(s)”還原成字符串。例5-9字符串拆分與組合函數(shù)使用示例。程序如下:s='abcde'print('{:s}split={}'.format(s,s.split()))s='a-b-c-de'print('{:s}split={}'.format(s,s.split('-')))print('{:s}partition={}'.format(s,s.partition('-')))6.字符串類型測試字符串類型測試函數(shù)返回的都是邏輯值。s.isalnum():是否全是字母和數(shù)字,并至少有一個字符s.isalpha():是否全是字母,并至少有一個字符s.isdigit():是否全是數(shù)字,并至少有一個字符s.isspace():是否全是空格,并至少有一個字符s.islower():s中的字母是否全是小寫s.isupper():s中的字母是否便是大寫s.istitle():s是否是首字母大寫例5-10字符串測試函數(shù)使用示例。程序如下:s='PythonProgram'print('{:s}isalnum={}'.format(s,s.isalnum()))print('{:s}isalpha={}'.format(s,s.isalpha()))print('{:s}isupper={}'.format(s,s.isupper()))print('{:s}islower={}'.format(s,s.islower()))print('{:s}isdigit={}'.format(s,s.isdigit()))s='3423'print('{:s}isdigit={}'.format(s,s.isdigit()))字符串是由Unicode字符組成的序列,用str類型符表示。字節(jié)類型是由編碼介于0~255之間的字符組成的序列,分為不可變字節(jié)類型和可變字節(jié)類型,分別用bytes類型符和bytearry符表示。在字符串前面加“b”可以定義bytes對象。bytes對象中的每一個字符可以是一個ASCII字符或\x00~\xff的十六進(jìn)制數(shù)。例如>>>by=b'abcd\x65'>>>byb'abcde'>>>type(by)<class'bytes'>5.4字節(jié)類型和字符串一樣,可以使用內(nèi)置的len()函數(shù)求bytes對象的長度,也可以使用“+”運(yùn)算符連接兩個bytes對象,其操作結(jié)果是一個新的bytes對象??梢允褂盟饕齺碓L問bytes對象中的某一個字符。對字符串做這種操作獲得的元素仍為字符串,而對bytes對象做這種操作的返回值則為整數(shù)。此外,bytes對象是不可改變的,不能對其賦值。如果需要改變某個字節(jié),可以組合使用字符串的分片和連接操作(效果跟字符串是一樣的),也可以將bytes對象轉(zhuǎn)換為bytearray對象,bytearray對象是可以被修改的。字符串與字節(jié)類型之間存在聯(lián)系。bytes對象有一個decode()方法,它使用某種字符編碼作為參數(shù),然后依照這種編碼方式將bytes對象轉(zhuǎn)換為字符串,對應(yīng)地,字符串有一個encode()方法,它也使用某種字符編碼作為參數(shù),然后依照它將串轉(zhuǎn)換為bytes對象。5.5.1正則表達(dá)式元字符正則表達(dá)式由普通字符和元字符組成。普通字符是正常的文本字符,具有字符的本來含義。元字符(metacharacter)具有特定的含義,它使正則表達(dá)式具有通用的匹配能力。5.5正則表達(dá)式下面是一些常用的正則表達(dá)式例子。(1)匹配帳號是否合法(設(shè)帳號以字母開頭,允許字母、數(shù)字及下劃線,包括5~16個字符):^[a-zA-Z][a-zA-Z0-9_]{4,15}$。(2)匹配國內(nèi)電話號碼:\d{3}-\d{8}|\d{4}-\d{7},例如0746-4405222。(3)匹配QQ號(設(shè)QQ號從10000開始):[1-9][0-9]{4,}。(4)匹配身份證(設(shè)身份證為15位或18位):\d{15}|\d{18}。(5)匹配特定數(shù)字。^[1-9]\d*$:匹配正整數(shù)。^-[1-9]\d*$:匹配負(fù)整數(shù)。^-?[1-9]\d*$:匹配整數(shù)。(6)匹配特定字符串。^[A-Za-z]+$:匹配由26個英文字母組成的字符串。^[A-Z]+$:匹配由26個大寫英文字母組成的字符串。^[a-z]+$:匹配由26個小寫英文字母組成的字符串。^[A-Za-z0-9]+$:匹配由數(shù)字和26個英文字母組成的字符串。^\w+$:匹配由數(shù)字、26個英文字母或者下劃線組成的字符串。5.5.2正則表達(dá)式模塊1.生成正則表達(dá)式對象使用re模塊的一般步驟是先使用compile()函數(shù)將正則表達(dá)式的字符串形式編譯為正則表達(dá)式對象,然后使用正則表達(dá)式對象提供的方法進(jìn)行字符串處理。compile()函數(shù)的一般調(diào)用格式是:pile(pattern[,flag])其中,參數(shù)pattern是代表匹配模式的正則表達(dá)式。flag是匹配選項(xiàng)標(biāo)志。2.字符匹配和搜索1)match()函數(shù)如果沒有生成正則表達(dá)式對象,使用match()函數(shù)可以直接進(jìn)行正則表達(dá)式的匹配。該函數(shù)的調(diào)用格式是:re.match(pattern,string[,flag])其中參數(shù)pattern是代表匹配模式的正則表達(dá)式,string是要匹配的字符串,flag是匹配選項(xiàng)標(biāo)志,可取的值與compile()函數(shù)的匹配選項(xiàng)標(biāo)志相同。2)search()函數(shù)如果想要搜索整個字符串來尋找匹配,應(yīng)當(dāng)用search()函數(shù)。search()函數(shù)也有兩種調(diào)用格式:re.search(pattern,string[,flag])search(string[,pos[,endpos]])參數(shù)的含義與match()函數(shù)相同。在字符串中查找匹配正則表達(dá)式模式的位置,返回match對象,如果沒有找到匹配的位置,則返回None。3)findall()函數(shù)findall()函數(shù)搜索字符串,以列表形式返回全部能匹配正則表達(dá)式的子串。該函數(shù)也有兩種調(diào)用格式。re.findall(pattern,string[,flag])findall(string[,pos[,endpos]])參數(shù)的含義與match()函數(shù)相同。4)finditer()函數(shù)findall()函數(shù)類似,在字符串中找到正則表達(dá)式所匹配的所有子串,并組成一個迭代器返回。該函數(shù)也有兩種調(diào)用格式。re.finditer(pattern,string[,flag])finditer(string[,pos[,endpos]])參數(shù)的含義與match()函數(shù)相同。3.字符替換re模塊的sub()函數(shù)、subn()函數(shù),或正則表達(dá)式對象的同名方法,使用正則表達(dá)式匹配字符串,用指定內(nèi)容替換結(jié)果,并返回替換后的字符串。sub()函數(shù)的兩種調(diào)用格式是:re.sub(pattern,repl,string[,count,flag])sub(repl,string[,count=0])該函數(shù)在字符串string中找到匹配正則表達(dá)式pattern的所有子串,用另一個字符串repl進(jìn)行替換。如果沒有找到匹配pattern的串,則返回未被修改的string。repl既可以是字符串也可以是一個函數(shù)。count用于指定最多替換次數(shù),不指定時全部替換。4.字符拆分re模塊的split()函數(shù)或正則表達(dá)式對象的同名方法,使用正則表達(dá)式匹配字符串,并拆分字符串,返回拆分后的字符串列表。split()函數(shù)的兩種調(diào)用格式是:re.split(pattern,string[,maxsplit,flag])split(string[,maxsplit])其中參數(shù)maxsplit用于指定最大拆分次數(shù),不指定將全部拆分。5.escape()函數(shù)re模塊還提供了一個escape(string)函數(shù),用于將string中的正則表達(dá)式特殊字符之前加上轉(zhuǎn)義符再返回。如果字符串很長且包含很多特殊字符,為避免輸入大量反斜杠,可以使用這個函數(shù)。5.6字符串應(yīng)用舉例例5-11輸入一個字符串,每次去掉最后面的字符并輸出。程序如下:s=input()foriinrange(-1,-len(s),-1):print(s[:i])例5-12翻譯密碼。分析:依次取電文中的字符,對其中的字母進(jìn)行處理,對字母之外的字符維持原樣。取字母的ASCII代碼,加上5,再按其ASCII碼轉(zhuǎn)換為另一個字母。還有一個問題要處理,當(dāng)字母為“V”時,加5就超過了“Z”,故應(yīng)使之轉(zhuǎn)換為“A”,同理,“W”→“B”,“X”→“C”,“Y”→“D”,“Z”→“E”。例5-13Python的標(biāo)識符以字母或下劃線(_)開頭,后接字母、數(shù)字或下劃線組成,從鍵盤輸入字符串,判斷它是否Python的標(biāo)識符。分析:利用string模塊中的常量,包括string.digits(數(shù)字0~9)、string.ascii_letters(所有大小寫字母)、string.ascii_lowercase(所有小寫字母)、string.ascii_uppercase(所有大寫字母)。先輸入字符串,再分別判斷首字符和中間字符,并給出提示。判斷中間字符利用for循環(huán)遍歷字符串。也可以構(gòu)造一個正則表達(dá)式來匹配所有合法的Python標(biāo)識符。例5-14從鍵盤輸入幾個數(shù)字,用逗號分隔,求這些數(shù)字之和。分析:輸入的數(shù)字當(dāng)作一個字符串來處理,首先分離出數(shù)字串,再轉(zhuǎn)換成數(shù)值,這樣就能求和。也可以使用正則表達(dá)式來實(shí)現(xiàn)。5.7.1網(wǎng)絡(luò)數(shù)據(jù)獲取1.?dāng)?shù)據(jù)采集與普通數(shù)據(jù)相比,網(wǎng)絡(luò)數(shù)據(jù)具有明顯的特點(diǎn),一是來源廣、數(shù)據(jù)量大、實(shí)時性和開放性強(qiáng),二是數(shù)據(jù)類型和語義豐富、弱規(guī)范性和非結(jié)構(gòu)化數(shù)據(jù)多。對于這類數(shù)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 安全教案小班上下樓梯
- 模具開發(fā)合同范本
- 機(jī)關(guān)試用期工作表現(xiàn)評語
- 2025承包合同公司承包合同范本
- 2025辦公樓施工合同范文
- 2025超市供貨合同書
- 稅務(wù)征信工作年度總結(jié)
- 污水處理廠的清潔衛(wèi)生管理
- 金屬行業(yè)顧問工作總結(jié)
- 2025物流倉儲運(yùn)輸合同
- 2024-2030年中國建筑玻璃行業(yè)市場深度調(diào)研及競爭格局與投資價值預(yù)測研究報告
- 泌尿:膀胱腫瘤病人的護(hù)理查房王雪-課件
- 企業(yè)短期中期長期規(guī)劃
- 中華民族共同體概論講稿專家版《中華民族共同體概論》大講堂之第一講:中華民族共同體基礎(chǔ)理論
- 《商務(wù)溝通-策略、方法與案例》課件 第一章 商務(wù)溝通概論
- 廣西《乳腺X射線數(shù)字化體層攝影診療技術(shù)操作規(guī)范》編制說明
- 風(fēng)箏產(chǎn)業(yè)深度調(diào)研及未來發(fā)展現(xiàn)狀趨勢
- 吉利汽車集團(tuán)總部機(jī)構(gòu)設(shè)置、崗位編制
- 礦山安全生產(chǎn)法律法規(guī)
- 小學(xué)數(shù)學(xué)《比的認(rèn)識單元復(fù)習(xí)課》教學(xué)設(shè)計(課例)
- 詞性轉(zhuǎn)換清單-2024屆高考英語外研版(2019)必修第一二三冊
評論
0/150
提交評論