Python語(yǔ)言程序設(shè)計(jì)(第2版)(含視頻教學(xué)) 課件 第5、6章 字符串與文本分析、列表與元組_第1頁(yè)
Python語(yǔ)言程序設(shè)計(jì)(第2版)(含視頻教學(xué)) 課件 第5、6章 字符串與文本分析、列表與元組_第2頁(yè)
Python語(yǔ)言程序設(shè)計(jì)(第2版)(含視頻教學(xué)) 課件 第5、6章 字符串與文本分析、列表與元組_第3頁(yè)
Python語(yǔ)言程序設(shè)計(jì)(第2版)(含視頻教學(xué)) 課件 第5、6章 字符串與文本分析、列表與元組_第4頁(yè)
Python語(yǔ)言程序設(shè)計(jì)(第2版)(含視頻教學(xué)) 課件 第5、6章 字符串與文本分析、列表與元組_第5頁(yè)
已閱讀5頁(yè),還剩96頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第5章字符串與文本分析字符串編碼字符串的索引與分片字符串的操作字節(jié)類型正則表達(dá)式字符串應(yīng)用舉例文本分析1.Unicode碼Unicode編碼標(biāo)準(zhǔn)為表達(dá)全世界所有語(yǔ)言的任意字符而設(shè)計(jì),它使用4字節(jié)的數(shù)字編碼來(lái)表達(dá)每個(gè)字母、符號(hào)或文字。每個(gè)數(shù)字編碼代表唯一的至少在某種語(yǔ)言中使用的符號(hào),被幾種語(yǔ)言共用的字符通常使用相同的數(shù)字來(lái)編碼,每個(gè)字符對(duì)應(yīng)一個(gè)數(shù)字編碼,每個(gè)數(shù)字編碼對(duì)應(yīng)一個(gè)字符,即不存在二義性。5.1字符串編碼2.UTF-8碼UTF-8是一種為Unicode字符設(shè)計(jì)的變長(zhǎng)編碼系統(tǒng),即不同的字符可使用不同數(shù)量的字節(jié)編碼。對(duì)于ASCII字符,UTF-8僅使用1個(gè)字節(jié)來(lái)編碼。UTF-8支持中英文編碼,英文系統(tǒng)也可以顯示中文。Python支持UTF-8編碼,中文字符、希臘字母均可以作為標(biāo)識(shí)符使用。例如:>>>π=3.14159>>>國(guó)家='中國(guó)'3.Unicode碼與UTF-8碼的轉(zhuǎn)換在Python中,可以通過(guò)字符串的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)索引,需要對(duì)字符串中的字符進(jìn)行編號(hào),最左邊字符編號(hào)為0,最右邊字符的編號(hào)比字符串的長(zhǎng)度小1。Python還支持在字符串中使用負(fù)數(shù)從右向左進(jìn)行編號(hào),最右邊的字符(即倒數(shù)第1個(gè)字符)的編號(hào)為-1。字符串變量名后接用中括號(hào)括起來(lái)的編號(hào)即可實(shí)現(xiàn)字符串的索引。5.2字符串的索引與分片例如:>>>s="Hello"字符串s中各個(gè)字符的索引編號(hào)如圖所示。例5-1將一個(gè)字符串中的字符按逆序打印出來(lái)。分析:先輸出字符串的最后一個(gè)字符,且不換行,然后輸出倒數(shù)第2個(gè)字符,同樣不換行,一直到第1個(gè)字符。利用for循環(huán)控制字符索引編號(hào),循環(huán)賦值目標(biāo)變量從0變化到字符串的長(zhǎng)度。取字符串的長(zhǎng)度可以利用len()函數(shù)。程序如下:s1=input("Pleaseenterastring:")foriinrange(0,len(s1)):print(s1[len(s1)-1-i],end='')5.2.2字符串的分片字符串的分片就是從給定的字符串中分離出部分字符,這時(shí)可以使用以下形式的字符串索引編號(hào)。i:j:k其中i是索引起始位置,j是索引結(jié)束位置但不包括j位置上的字符,索引編號(hào)每次增加的步長(zhǎng)為k。例如:>>>s="HelloWorld!">>>print(s[0:5:2])Hlo>>>s='abcdefg'>>>s[5:1:-1]'fedc'>>>s[-len(s):-1]'abcdef'例5-2利用字符串分片方法將一個(gè)字符串中的字符按逆序打印出來(lái)。程序如下:s1=input("Pleaseenterastring:")s2=s1[::-1]print(s2)5.3.1字符串連接操作1.基本連接操作字符串表達(dá)式是指用“連接”運(yùn)算符把字符串常量、字符串變量等字符串?dāng)?shù)據(jù)連接起來(lái)的有意義的式子,它的一般格式是:s1+s2+……+sn其中s1,s2,……,sn均是一個(gè)字符串,表達(dá)式的值也是一個(gè)字符串。例如:>>>"Sub"+"string"'Substring'5.3字符串的操作2.重復(fù)連接操作Python提供乘法運(yùn)算符(*),構(gòu)建一個(gè)由其自身字符串重復(fù)連接而成的字符串。字符串重復(fù)連接的一般格式是:s*n或n*s其中s是一個(gè)字符串;n是一個(gè)正整數(shù),代表重復(fù)的次數(shù)。例如:>>>"ABCD"*2'ABCDABCD'例5-3從鍵盤輸入5個(gè)字符串,將它們連接成一個(gè)字符串后輸出。s=''foriinrange(0,5):c=input("Pleaseenterastring:")s+=cprint(s)3.連接操作的其他實(shí)現(xiàn)對(duì)于連接操作,可以用格式化操作符或join()函數(shù)取代,這樣只會(huì)有一次內(nèi)存的申請(qǐng),以提高操作效率。例如:>>>'{:s}{:s}{:s}'.format('Python','','Program')'PythonProgram'>>>''.join(['Python','','Program'])'PythonProgram'5.3.2字符串邏輯操作1.關(guān)系操作在進(jìn)行字符串?dāng)?shù)據(jù)的比較時(shí),遵循以下規(guī)則。(1)單個(gè)字符比較,按字符ASCII碼大小進(jìn)行比較。(2)兩個(gè)相同長(zhǎng)度的字符串的比較是將字符串中的字符從左向右逐個(gè)比較,如果所有字符都相等,則兩個(gè)字符串相等,如果兩個(gè)字符串中有不同的字符,以最左邊的第1對(duì)不同字符的比較結(jié)果為準(zhǔn)。(3)若兩個(gè)字符串中字符個(gè)數(shù)不等時(shí),則將較短的字符串后面補(bǔ)足空格后再比較。例5-4從鍵盤輸入10個(gè)英文單詞,輸出其中以元音字母開頭的單詞。分析:輸入一個(gè)英文單詞,并進(jìn)行判斷,用for循環(huán)控制重復(fù)執(zhí)行10次。可以將所有元音字母構(gòu)成一個(gè)字符串,遍歷該字符串中的各個(gè)字符,并判斷單詞的首字母。2.成員關(guān)系操作字符串的成員關(guān)系操作包括in和notin操作,一般格式為:字符串1[not]in字符串2該操作用于判斷字符串1是否屬于字符串2,其返回值為True或False.例如:>>>'a'in'abc'True5.3.3字符串的常用方法函數(shù)可以通過(guò)函數(shù)名直接調(diào)用,如ord('A'),而對(duì)象中的方法則要通過(guò)對(duì)象名和方法名來(lái)調(diào)用,一般形式為:對(duì)象名.方法名(參數(shù))在Python中,字符串類型(String)可以看成是一個(gè)類(Class),而一個(gè)具體的字符串可以看成是一個(gè)對(duì)象,該對(duì)象具有很多方法,這些方法是通過(guò)類的成員函數(shù)來(lái)實(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.字符串對(duì)齊處理s.ljust(width,[fillchar]):輸出width個(gè)字符,s左對(duì)齊,右邊不足部分用fillchar填充,默認(rèn)用空格填充。s.rjust(width,[fillchar]):輸出width個(gè)字符,s右對(duì)齊,左邊不足部分用fillchar填充,默認(rèn)用空格填充。s.center(width,[fillchar])輸出width個(gè)字符,s中間對(duì)齊,兩邊不足部分用fillchar填充,默認(rèn)用空格填充。s.zfill(width):把s變成width長(zhǎng),并且右對(duì)齊,左邊不足部分用0補(bǔ)齊。例5-6字符串對(duì)齊處理函數(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個(gè)字符的編號(hào),如果s中沒有substr則返回-1。start和end作用就相當(dāng)于在s[start:end]中搜索。s.index(substr,[start,[end]]):與find()相同,只是在s中沒有substr時(shí),會(huì)返回一個(gè)運(yùn)行時(shí)錯(cuò)誤。s.rfind(substr,[start,[end]]):返回s中最后出現(xiàn)的substr的第1個(gè)字符的編號(hào),如果s中沒有substr則返回-1,也就是說(shuō)從右邊算起的第1次出現(xiàn)的substr的首字符編號(hào)。3.字符串搜索s.rindex(substr,[start,[end]]):與rfind()相同,只是在s中沒有substr時(shí),會(huì)返回一個(gè)運(yùn)行時(shí)錯(cuò)誤。s.count(substr,[start,[end]]):計(jì)算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字符替換為空格,每個(gè)tab替換為tabsize個(gè)空格,默認(rèn)是8個(gè)。例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拆分成一個(gè)列表。默認(rèn)的分隔符為空格。maxsplit表示拆分的次數(shù),默認(rèn)取-1,表示無(wú)限制拆分。s.rsplit([sep,[maxsplit]]):從右側(cè)把字符串s拆分成一個(gè)列表。s.splitlines([keepends]):把s按行拆分分為一個(gè)列表。keepends是一個(gè)邏輯值,如果為True,則每行拆分后會(huì)保留行分隔符。s.partition(sub):從sub出現(xiàn)的第1個(gè)位置起,把字符串s拆分成一個(gè)3元素的元組(sub左邊字符,sub,sub右邊字符)。如果s中不包含sub則返回(s,'','')。s.rpartition(sub):從右側(cè)開始,把字符串s拆分成一個(gè)3元素的元組(sub左邊字符,sub,sub右邊字符)。如果s中不包含sub則返回('','',s)。s.join(seq):把seq代表的序列組合成字符串,用s將序列各元素連接起來(lái)。字符串中的字符是不能修改的,如果要修改,通常的方法是,用list()函數(shù)把字符串s變?yōu)橐詥蝹€(gè)字符為成員的列表(使用語(yǔ)句s=list(s)),再使用給列表成員賦值的方式改變值(如s[3]='a'),最后再使用語(yǔ)句“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.字符串類型測(cè)試字符串類型測(cè)試函數(shù)返回的都是邏輯值。s.isalnum():是否全是字母和數(shù)字,并至少有一個(gè)字符s.isalpha():是否全是字母,并至少有一個(gè)字符s.isdigit():是否全是數(shù)字,并至少有一個(gè)字符s.isspace():是否全是空格,并至少有一個(gè)字符s.islower():s中的字母是否全是小寫s.isupper():s中的字母是否便是大寫s.istitle():s是否是首字母大寫例5-10字符串測(cè)試函數(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對(duì)象。bytes對(duì)象中的每一個(gè)字符可以是一個(gè)ASCII字符或\x00~\xff的十六進(jìn)制數(shù)。例如>>>by=b'abcd\x65'>>>byb'abcde'>>>type(by)<class'bytes'>5.4字節(jié)類型和字符串一樣,可以使用內(nèi)置的len()函數(shù)求bytes對(duì)象的長(zhǎng)度,也可以使用“+”運(yùn)算符連接兩個(gè)bytes對(duì)象,其操作結(jié)果是一個(gè)新的bytes對(duì)象??梢允褂盟饕齺?lái)訪問bytes對(duì)象中的某一個(gè)字符。對(duì)字符串做這種操作獲得的元素仍為字符串,而對(duì)bytes對(duì)象做這種操作的返回值則為整數(shù)。此外,bytes對(duì)象是不可改變的,不能對(duì)其賦值。如果需要改變某個(gè)字節(jié),可以組合使用字符串的分片和連接操作(效果跟字符串是一樣的),也可以將bytes對(duì)象轉(zhuǎn)換為bytearray對(duì)象,bytearray對(duì)象是可以被修改的。字符串與字節(jié)類型之間存在聯(lián)系。bytes對(duì)象有一個(gè)decode()方法,它使用某種字符編碼作為參數(shù),然后依照這種編碼方式將bytes對(duì)象轉(zhuǎn)換為字符串,對(duì)應(yīng)地,字符串有一個(gè)encode()方法,它也使用某種字符編碼作為參數(shù),然后依照它將串轉(zhuǎn)換為bytes對(duì)象。5.5.1正則表達(dá)式元字符正則表達(dá)式由普通字符和元字符組成。普通字符是正常的文本字符,具有字符的本來(lái)含義。元字符(metacharacter)具有特定的含義,它使正則表達(dá)式具有通用的匹配能力。5.5正則表達(dá)式下面是一些常用的正則表達(dá)式例子。(1)匹配帳號(hào)是否合法(設(shè)帳號(hào)以字母開頭,允許字母、數(shù)字及下劃線,包括5~16個(gè)字符):^[a-zA-Z][a-zA-Z0-9_]{4,15}$。(2)匹配國(guó)內(nèi)電話號(hào)碼:\d{3}-\d{8}|\d{4}-\d{7},例如0746-4405222。(3)匹配QQ號(hào)(設(shè)QQ號(hào)從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個(gè)英文字母組成的字符串。^[A-Z]+$:匹配由26個(gè)大寫英文字母組成的字符串。^[a-z]+$:匹配由26個(gè)小寫英文字母組成的字符串。^[A-Za-z0-9]+$:匹配由數(shù)字和26個(gè)英文字母組成的字符串。^\w+$:匹配由數(shù)字、26個(gè)英文字母或者下劃線組成的字符串。5.5.2正則表達(dá)式模塊1.生成正則表達(dá)式對(duì)象使用re模塊的一般步驟是先使用compile()函數(shù)將正則表達(dá)式的字符串形式編譯為正則表達(dá)式對(duì)象,然后使用正則表達(dá)式對(duì)象提供的方法進(jìn)行字符串處理。compile()函數(shù)的一般調(diào)用格式是:pile(pattern[,flag])其中,參數(shù)pattern是代表匹配模式的正則表達(dá)式。flag是匹配選項(xiàng)標(biāo)志。2.字符匹配和搜索1)match()函數(shù)如果沒有生成正則表達(dá)式對(duì)象,使用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ù)如果想要搜索整個(gè)字符串來(lái)尋找匹配,應(yīng)當(dāng)用search()函數(shù)。search()函數(shù)也有兩種調(diào)用格式:re.search(pattern,string[,flag])search(string[,pos[,endpos]])參數(shù)的含義與match()函數(shù)相同。在字符串中查找匹配正則表達(dá)式模式的位置,返回match對(duì)象,如果沒有找到匹配的位置,則返回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á)式所匹配的所有子串,并組成一個(gè)迭代器返回。該函數(shù)也有兩種調(diào)用格式。re.finditer(pattern,string[,flag])finditer(string[,pos[,endpos]])參數(shù)的含義與match()函數(shù)相同。3.字符替換re模塊的sub()函數(shù)、subn()函數(shù),或正則表達(dá)式對(duì)象的同名方法,使用正則表達(dá)式匹配字符串,用指定內(nèi)容替換結(jié)果,并返回替換后的字符串。sub()函數(shù)的兩種調(diào)用格式是:re.sub(pattern,repl,string[,count,flag])sub(repl,string[,count=0])該函數(shù)在字符串string中找到匹配正則表達(dá)式pattern的所有子串,用另一個(gè)字符串repl進(jìn)行替換。如果沒有找到匹配pattern的串,則返回未被修改的string。repl既可以是字符串也可以是一個(gè)函數(shù)。count用于指定最多替換次數(shù),不指定時(shí)全部替換。4.字符拆分re模塊的split()函數(shù)或正則表達(dá)式對(duì)象的同名方法,使用正則表達(dá)式匹配字符串,并拆分字符串,返回拆分后的字符串列表。split()函數(shù)的兩種調(diào)用格式是:re.split(pattern,string[,maxsplit,flag])split(string[,maxsplit])其中參數(shù)maxsplit用于指定最大拆分次數(shù),不指定將全部拆分。5.escape()函數(shù)re模塊還提供了一個(gè)escape(string)函數(shù),用于將string中的正則表達(dá)式特殊字符之前加上轉(zhuǎn)義符再返回。如果字符串很長(zhǎng)且包含很多特殊字符,為避免輸入大量反斜杠,可以使用這個(gè)函數(shù)。5.6字符串應(yīng)用舉例例5-11輸入一個(gè)字符串,每次去掉最后面的字符并輸出。程序如下:s=input()foriinrange(-1,-len(s),-1):print(s[:i])例5-12翻譯密碼。分析:依次取電文中的字符,對(duì)其中的字母進(jìn)行處理,對(duì)字母之外的字符維持原樣。取字母的ASCII代碼,加上5,再按其ASCII碼轉(zhuǎn)換為另一個(gè)字母。還有一個(gè)問題要處理,當(dāng)字母為“V”時(shí),加5就超過(guò)了“Z”,故應(yīng)使之轉(zhuǎn)換為“A”,同理,“W”→“B”,“X”→“C”,“Y”→“D”,“Z”→“E”。例5-13Python的標(biāo)識(shí)符以字母或下劃線(_)開頭,后接字母、數(shù)字或下劃線組成,從鍵盤輸入字符串,判斷它是否Python的標(biāo)識(shí)符。分析:利用string模塊中的常量,包括string.digits(數(shù)字0~9)、string.ascii_letters(所有大小寫字母)、string.ascii_lowercase(所有小寫字母)、string.ascii_uppercase(所有大寫字母)。先輸入字符串,再分別判斷首字符和中間字符,并給出提示。判斷中間字符利用for循環(huán)遍歷字符串。也可以構(gòu)造一個(gè)正則表達(dá)式來(lái)匹配所有合法的Python標(biāo)識(shí)符。例5-14從鍵盤輸入幾個(gè)數(shù)字,用逗號(hào)分隔,求這些數(shù)字之和。分析:輸入的數(shù)字當(dāng)作一個(gè)字符串來(lái)處理,首先分離出數(shù)字串,再轉(zhuǎn)換成數(shù)值,這樣就能求和。也可以使用正則表達(dá)式來(lái)實(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),一是來(lái)源廣、數(shù)據(jù)量大、實(shí)時(shí)性和開放性強(qiáng),二是數(shù)據(jù)類型和語(yǔ)義豐富、弱規(guī)范性和非結(jié)構(gòu)化數(shù)據(jù)多。對(duì)于這類數(shù)據(jù),網(wǎng)絡(luò)爬蟲技術(shù)是一種重要的采集手段。5.7文本分析網(wǎng)絡(luò)爬蟲(Webcrawler)又稱為網(wǎng)絡(luò)蜘蛛(Webspider),是一種按照一定的規(guī)則自動(dòng)抓取網(wǎng)頁(yè)信息的程序或腳本。網(wǎng)絡(luò)爬蟲的工作流程包括抓取網(wǎng)頁(yè)源代碼、解析網(wǎng)頁(yè)內(nèi)容、存儲(chǔ)數(shù)據(jù)等步驟。要抓取網(wǎng)頁(yè)通常有兩個(gè)庫(kù),一個(gè)是Python內(nèi)置的urllib庫(kù),一個(gè)是requests第三方庫(kù)。requests是一個(gè)第三方庫(kù),先要進(jìn)行安裝,然后在Python環(huán)境下導(dǎo)入庫(kù),再調(diào)用get()函數(shù)獲取到特定網(wǎng)頁(yè)的信息。2.信息提取通過(guò)調(diào)用requests庫(kù)函數(shù),可以得到網(wǎng)頁(yè)資源。此時(shí),可以將其作為普通文本,采用正則表達(dá)式進(jìn)行信息提取。5.7.2中文分詞與詞頻統(tǒng)計(jì)文本分析的主要過(guò)程包括分詞、去停用詞、特征提取、建模分析等。1.分詞與分詞模式在Python中,可以利用第三方庫(kù)jieba來(lái)實(shí)現(xiàn)分詞操作。jieba支持以下三種分詞模式。(1)精確模式:將文本精確地分開,不存在冗余單詞,適合做文本分析。(2)全模式:把文本中所有可能的詞語(yǔ)都切分出來(lái),存在冗余單詞。(3)搜索引擎模式:在精確模式的基礎(chǔ)上,對(duì)長(zhǎng)詞再次進(jìn)行切分,適合用于搜索引擎分詞。2.詞頻統(tǒng)計(jì)詞頻統(tǒng)計(jì)是文本分析中常見的工作,它可以幫助了解文本中各個(gè)詞匯出現(xiàn)的頻率及其分布情況??梢允褂肞ython內(nèi)置庫(kù)collections中的Counter()函數(shù)進(jìn)行詞頻統(tǒng)計(jì)。Counter()函數(shù)統(tǒng)計(jì)列表中元素出現(xiàn)的次數(shù),返回一個(gè)字典,其中關(guān)鍵字是元素,值是元素出現(xiàn)的次數(shù)。還可以輸出詞頻最高的詞語(yǔ)。5.7.3中文詞云圖制作在Python中,可以通過(guò)第三方庫(kù)wordcloud來(lái)制作詞云圖,基本步驟如下。(1)安裝并導(dǎo)入wordcloud庫(kù)。(2)使用wordcloud庫(kù)的WordCloud()函數(shù)根據(jù)參數(shù)創(chuàng)建WordCloud對(duì)象。(3)使用WordCloud對(duì)象的generate(txt)方法將文本數(shù)據(jù)txt(會(huì)根據(jù)空格分詞)轉(zhuǎn)換為詞云圖。(4)使用WordCloud對(duì)象的to_file()方法將詞云圖保存為圖像文件(png或jpg格式)。例5-15新聞熱詞分析。對(duì)人民網(wǎng)()經(jīng)濟(jì)與科技專欄的信息進(jìn)行爬取,并分析其中的新聞熱詞,繪制詞云圖。分析:首先采用requests庫(kù)的get方法進(jìn)行資源獲取。由于這里僅進(jìn)行新聞熱詞分析,非中文字符沒有價(jià)值,可以將其全部剔除。然后進(jìn)行分詞。為排除干擾,仍然需要將沒有太大意義的單字符詞語(yǔ)去掉。最后繪制并顯示詞云圖。此外,使用背景圖片使得詞云更加美觀。第6章列表與元組序列的通用操作列表的專用操作元組與列表的比較序列的應(yīng)用6.1序列的通用操作6.1.1序列的索引與分片1.序列的索引序列中的每一個(gè)元素被分配一個(gè)位置編號(hào),稱為索引(index)。第一個(gè)元素的索引為0,第二個(gè)元素的索引為1,依此類推。序列的元素可以通過(guò)索引進(jìn)行訪問,一般格式為:序列名[索引]例如:>>>greeting="hello">>>greeting[0]'H'除了常見的正向索引,Python序列還支持反向索引,即負(fù)數(shù)索引,可以從最后一個(gè)元素開始計(jì)數(shù),最后一個(gè)元素的索引是-1,倒數(shù)第二個(gè)元素的索引是-2,依此類推。使用負(fù)數(shù)索引,可以在無(wú)需計(jì)算序列長(zhǎng)度的前提下很方便地定位序列中的元素。例如:>>>greeting[-1]'o'2.序列的分片分片(slice)就是取出序列中某一范圍內(nèi)的元素,從而得到一個(gè)新的序列。序列分片的一般格式為:序列名[起始索引:終止索引:步長(zhǎng)]其中,起始索引是提取部分的第一個(gè)元素的編號(hào),終止索引對(duì)應(yīng)的元素不包含在分片范圍內(nèi)。步長(zhǎng)為非零整數(shù),當(dāng)步長(zhǎng)為負(fù)數(shù)時(shí),從右到左提取元素。當(dāng)忽略參數(shù)時(shí),起始元素默認(rèn)為第一個(gè),終止索引默認(rèn)為最后一個(gè),步長(zhǎng)默認(rèn)為1。例如:>>>number=[1,2,3,4,5,6,7,8,9,10]>>>number[3:6][4,5,6]>>>number[0:1][1]

注意:分片操作是產(chǎn)生新的序列,不會(huì)改變?cè)瓉?lái)的序列。例如:>>>x=['a','b','c','d']>>>y=x[:]>>>id(x),id(y)(35812056,35833816)x[:]將產(chǎn)生一個(gè)新的列表,所以x和y代表不同的對(duì)象。而語(yǔ)句y=x則是給x的內(nèi)容再取一個(gè)名字y,也就是x和y都指向相同的存儲(chǔ)內(nèi)容,并沒有實(shí)現(xiàn)存儲(chǔ)內(nèi)容的真正的復(fù)制??聪旅娴恼Z(yǔ)句。>>>x=['a','b','c','d']>>>y=x>>>id(x),id(y)(35812736,35812736)6.1.2序列的計(jì)算1.序列相加通過(guò)使用加號(hào)可以進(jìn)行序列的連接操作。例如:>>>[1,2,3]+[4,5,6][1,2,3,4,5,6]注意,只有兩種相同類型的序列才能進(jìn)行連接操作。2.序列相乘用整數(shù)n乘以一個(gè)序列會(huì)生成新的序列,在新序列中,原來(lái)的序列將重復(fù)n次。當(dāng)n<1時(shí),將返回空列表。例如:>>>(42,)*5(42,42,42,42,42)>>>2*[1,2,3,4,5][1,2,3,4,5,1,2,3,4,5]3.序列比較兩個(gè)序列對(duì)象可以進(jìn)行比較操作,其規(guī)則是兩個(gè)序列的第一個(gè)元素先進(jìn)行比較,如果第1個(gè)元素可以得出結(jié)果,那么就得出序列比較結(jié)果。如果第一個(gè)元素一樣,則繼續(xù)比較下一個(gè)元素,如果元素本身也是序列,則對(duì)元素進(jìn)行以上過(guò)程。例如:>>>(1,2,3)<(1,2,4)True4.成員資格成員資格用于檢查一個(gè)值是否包含在某個(gè)序列中,Python使用in運(yùn)算符檢查元素的成員資格,并返回邏輯型的結(jié)果(True或False)。例如:>>>p=(1,2,3,4,5)>>>5inpTrue6.1.3序列處理函數(shù)1.len()、max()和min()函數(shù)len(s):返回序列中包含元素的個(gè)數(shù),即序列長(zhǎng)度。min(s):返回序列中最小的元素。max(s):返回序列中最大的元素。2.sum()函數(shù)和reduce()函數(shù)sum(s):返回序列s中所有元素的和。要求元素必須為數(shù)值,否則出現(xiàn)TypeError錯(cuò)誤。reduce(f,s[,n]):reduce()函數(shù)把序列s的前兩個(gè)元素作為參數(shù)傳給函數(shù)f,返回計(jì)算的結(jié)果和序列的下一個(gè)元素重新作為f的參數(shù),直到序列的最后一個(gè)元素。reduce()函數(shù)的返回值是函數(shù)f的返回值。在Python3.x中,reduce()函數(shù)已經(jīng)從全局名字空間中移出,放到了functools模塊中。如果需要,使用functools.reduce()調(diào)用格式。在Python2.x中,reduce是一個(gè)全局函數(shù),可直接調(diào)用。3.enumerate()和zip()函數(shù)enumerate(iter):接收一個(gè)可迭代對(duì)象作為參數(shù),返回一個(gè)enumerate對(duì)象,該對(duì)象生成由iter每個(gè)元素的索引值和元素值組成的元組。zip([s0,s1,……,sn]):接收任意多個(gè)序列作為參數(shù),返回一個(gè)可迭代對(duì)象,其第一個(gè)元素是s0,s1,……,sn這些元素的第一個(gè)元素組成的一個(gè)元組,后面的元素依次類推。若參數(shù)的長(zhǎng)度不等,則返回列表的長(zhǎng)度和參數(shù)中長(zhǎng)度最短的對(duì)象相同。利用*號(hào)操作符,可以將對(duì)象解壓還原。4.sorted()函數(shù)和reversed()函數(shù)sorted(iterable,key=None,reverse=False):函數(shù)返回對(duì)可迭代對(duì)象iterable中元素進(jìn)行排序后的列表,函數(shù)返回副本,原始輸入不變。iterable是可迭代類型;key指定一個(gè)接收一個(gè)參數(shù)的函數(shù),這個(gè)函數(shù)用于計(jì)算比較的鍵值,默認(rèn)值為None;reverse代表排序規(guī)則,當(dāng)reverse為True時(shí)按降序排序;reverse為False時(shí)按升序,默認(rèn)按升序。reversed(iterable):對(duì)可迭代對(duì)象iterable的元素按逆序排列,返回一個(gè)新的可迭代變量。5.a(chǎn)ll()和any()函數(shù)設(shè)s為一個(gè)序列,下面的內(nèi)置函數(shù)可用于表、元組和字符串。all(s):如果序列s所有元素都為True,則返回True,否則返回False。any(s):如果序列任一元素為True,則返回True,否則返回False。6.1.4序列拆分賦值使用賦值語(yǔ)句,可以將序列賦給一個(gè)變量,也可以將序列拆分,賦給多個(gè)變量。例如:>>>x=[1,2,3,4]>>>x[1,2,3,4]>>>a,b,c,d=[1,2,3,4]>>>print(a,b,c,d)1234可以在變量名前面加星號(hào)(*),將序列的多個(gè)元素值賦給相應(yīng)的變量。例如:>>>a,*b,c=[1,2,3,4]>>>print(a,b,c)1[2,3]4>>>*a,b,c=[1,2,3,4]>>>print(a,b,c)[1,2]346.2列表的專有操作6.2.1列表的基本操作1.元素賦值使用索引編號(hào)來(lái)為某個(gè)特定的元素賦值,從而可以修改列表。例如:>>>x=[1,1,1]>>>x[1]=10>>>x[1,10,1]2.元素刪除從列表中刪除元素也很容易,使用del語(yǔ)句來(lái)實(shí)現(xiàn)。例如:>>>names=['Alice','Beth','Cecil','Jack','Earl']>>>delnames[2]>>>names['Alice','Beth','Jack','Earl']3.分片賦值使用分片賦值可以給列表的多個(gè)元素提示賦值。例如:>>>name=list('Perl')>>>name[2:]=list('ar')>>>name['P','e','a','r']4.列表解析在一個(gè)序列的值上應(yīng)用一個(gè)任意表達(dá)式,將其結(jié)果收集到一個(gè)新的列表中并返回。它的基本形式是一個(gè)中括號(hào)里面包含一個(gè)for語(yǔ)句對(duì)一個(gè)可迭代對(duì)象進(jìn)行迭代。例如:>>>[iforiinrange(8)][0,1,2,3,4,5,6,7]在列表解析中,可以增加測(cè)試語(yǔ)句和嵌套循環(huán)。一般形式如下:[表達(dá)式for目標(biāo)1in可迭代對(duì)象1[if條件1]……for目標(biāo)nin可迭代對(duì)象n[if條件n]]任意數(shù)量嵌套的for循環(huán)同時(shí)關(guān)聯(lián)可選的if測(cè)試,其中if測(cè)試語(yǔ)句是可選的,for上下之間表示的是一個(gè)嵌套關(guān)系。例如:>>>[(x,y)forxinrange(5)ifx%2==0foryinrange(5)ify%2==1][(0,1),(0,3),(2,1),(2,3),(4,1),(4,3)]6.2.2列表的常用方法1.適用于序列的方法s.count(x):返回x在序列s中出現(xiàn)的次數(shù)。例如:>>>x=[1,2,1,2,2]>>>x.count(2)3s.index(x):返回x在s中第一次出現(xiàn)的下標(biāo)。2.只適用于列表的方法s.append(x):在列表s的末尾附加x元素。例如:>>>lst=[1,2,3]>>>lst.append(4)>>>lst[1,2,3,4]s.extend(s1):在列表s的末尾添加列表s1的所有元素。s.sort():對(duì)列表s中的元素排序。s.reverse():將列表s中的元素逆序排列。s.pop([i]):刪除并返回列表s中指定位置i的元素,默認(rèn)是最后一個(gè)元素.若i超出列表長(zhǎng)度,則拋出IndexError異常。s.insert(i,x):在列表s的i位置處插入x,如果i大于列表的長(zhǎng)度,則插入到列表最后。s.remove(x):從列表s中刪除x,若x不存在,則拋出ValueError異常。6.3元組與列表的比較1.元組與列表的區(qū)別(1)元組是不可變的序列類型,元組能對(duì)不需要改變的數(shù)據(jù)進(jìn)行寫保護(hù),使數(shù)據(jù)更安全。列表是可變的序列類型,可以添加、刪除或搜索列表中的元素。(2)元組使用小括號(hào)定義用逗號(hào)分隔的元素,而列表中的元素應(yīng)該包括在中括號(hào)中。雖然元組使用小括號(hào),但訪問元組元素時(shí),要使用中括號(hào)按索引或分片來(lái)獲得對(duì)于元素的值。(3)元組可以在字典中當(dāng)作關(guān)鍵字使用,而列表不能當(dāng)作字典關(guān)鍵字使用,因?yàn)榱斜聿皇遣豢筛淖兊摹#?)只要不嘗試修改元組,那么大多數(shù)情況下把它們當(dāng)作列表來(lái)進(jìn)行操作。2.元組元素的可變性元組中的數(shù)據(jù)一旦定義就不允許更改,因此元組沒有append()方法、extend()方法或insert()方法,無(wú)法向元組中添加元素;元組也沒有pop()方法或remove()方法,不能從元組中刪除元素;元組也沒有sort()方法或reverse()方法,不能修改元組的值。刪除元組的元素是不可能的,但可以使用del語(yǔ)句刪除整個(gè)元組。3.元組與列表的轉(zhuǎn)換元組和列表可以通過(guò)list()函數(shù)和tuple()函數(shù)實(shí)現(xiàn)相互轉(zhuǎn)換。list()函數(shù)接收一個(gè)元組參數(shù),返回一個(gè)包含同樣元素的列表;tuple()函數(shù)接收一個(gè)列表參數(shù),返回一個(gè)包含同樣元素的元組。從實(shí)現(xiàn)效果上看,tuple()函數(shù)凍結(jié)列表,達(dá)到保護(hù)的目的,而list()函數(shù)融化元組,達(dá)到修改的目的。6.4序列的應(yīng)用6.4.1數(shù)據(jù)排序在Python中,數(shù)據(jù)排序可以直接使用sort方法或sorted()函數(shù),也可以自己編寫排序的程序。

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論