版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第5章字符串與正則表達式第5章
字符串5.1字符串編碼5.2字符串的索引和切片5.3字符串的操作5.4正則表達式1.Unicode碼Unicode編碼標準為表達全世界所有語言的任意字符而設(shè)計,它使用4字節(jié)的數(shù)字編碼來表達每個字母、符號或文字。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編碼,中文字符、希臘字母均可以作為標識符使用。例如:>>>單價=13>>>數(shù)量=100>>>print(單價*數(shù)量)1300兩個內(nèi)置函數(shù)ord()函數(shù):將一個字符轉(zhuǎn)化為Unicode碼>>>ord("中")20013>>>print("?是白羊座的符號,其Unicode碼是",ord("?"))?是白羊座的符號,其Unicode碼是9800chr()函數(shù):將一個整數(shù)轉(zhuǎn)換為Unicode字符。>>>chr(10005),chr(10004)('?','?’)>>>print("金牛座的Unicode碼是9801,其符號為",chr(9801))金牛座的Unicode碼是9801,其符號為?
5.2.1字符串的索引字符串是一種元素為字符的序列類型。5.2字符串的索引與分片注意:索引編號要求為整數(shù),且不能越界。索引編號:正索引:從左向右編號,最左邊的字符編號為0,最后一個字符的編號比長度小1。負索引:從右向左編號,最右邊的字符編號為-1。通過索引編號可以獲取字符串中的某個字符。格式:字符串變量名[索引編號]例如:s[2]、s[-1]在Python中,字符串是不可變對象,不能用下標賦值的方式去改變字符串.>>>s="python">>>s[0]="P"Traceback(mostrecentcalllast):File"<pyshell#17>",line1,in<module>s[0]="P"TypeError:'str'objectdoesnotsupportitemassignment【例5-1】獲取星期字符串。weekStr="一二三四五六日"weekId=eval(input("請輸入星期數(shù)字(1~7):"))print("星期"+weekStr[weekId-1])【例5-2】編寫一個程序,判斷一個字符串是否為“回文”(順讀和倒讀都一樣的字符串稱為“回文”)。如果輸入字符串是回文,則輸出“yes”;如果字符串不是回文,則輸出“no”。例如:ABCBA或者AACCAA是回文字符串;ABCCA或者AABBCC不是回文字符串。a=input("請輸入一個字符串:")n=len(a)i,j,f=0,-1,1whilei<n/2:ifa[i]!=a[j]:f=0breaki=i+1j=j-1iff==1:print("yes")else:print("no")5.2.2字符串的切片字符串的分片就是從給定的字符串中分離出部分字符。格式:字符串[M:N:K]其中M是索引起始位置,N是索引結(jié)束位置但不包括N位置上的字符,索引編號每次增加的步長為K。>>>s="0123456789987654321">>>s[0:8:2]'0246'>>>s[-1:-4:-1]'123'>>>s[-9:15:1]'98765'注意:不包括索引結(jié)束位置上的字符。正索引范圍:0~字符串長度-1負索引范圍:-字符串長度~-1當索引起始位置i省略時,從0或-1開始。當結(jié)束位置j省略時,默認到最后一個字符。當步長k省略時,默認為1。>>>s="abcdefg">>>s[5:1:-1]'fedc'>>>s[-len(s):-1]'abcdef‘(5)開始和結(jié)束的索引值可以超過字符串的長度。>>>s[-100:100]'ABCDEFGHIJK'>>>s="ABCDEFGHIJK">>>s[::]'ABCDEFGHIJK'>>>s[::-1]'KJIHGFEDCBA'>>>s[1::]'BCDEFGHIJK'>>>s[:-1:]'ABCDEFGHIJ'>>>s[::-2]'KIGECA's="teacher",能夠顯示輸出teacher的選項是:(
)。A.print(s[0:-1])B.print(s[-1:0])
C.print(s[:])D.print(s[:6])答案:C設(shè)str="hello",想把字符串的第一個字母大寫,其他字母還是小寫,正確的選項是:(
)。A.print(str[1].upper()+str[-1:1])B.print(str[0].upper()+str[1:-1])C.print(str[1].upper()+str[2:])D.print(str[0].upper()+str[1:])答案:D【例5-3】用字符串切片的方法解決例題5-2的回文問題。s=input("請輸入一個字符串")d=s[::-1]ifd==s:print("yes")else:print("no")5.3.1字符串連接操作1.加號連接操作運算符:+字符串連接表達式的格式是:s1+s2+……+sn例如:>>>"Python"+"語言"+"程序設(shè)計基礎(chǔ)"'Python語言程序設(shè)計基礎(chǔ)’5.3字符串的操作>>>"abcd"+1234TypeError:canonlyconcatenatestr(not"int")tostr>>>"abcd"+str(1234)'abcd1234'“1234”+1234的計算結(jié)果的是()(A)“1234”+1234 (B)“12341234”
(C)2468 (D)提示類型錯誤,無法運行答案:D注意:將字符串和數(shù)值數(shù)據(jù)進行連接時,需要將數(shù)值數(shù)據(jù)用str()函數(shù)或repr()函數(shù)轉(zhuǎn)換成字符串,再進行連接。字符串是不可變類型,其中的字符不能被賦值更改。>>>s=“abcdefg“s[1]=‘8‘TypeError:'str'objectdoesnotsupportitemassignment錯誤!如果要把s[1]改為’8’,怎么辦?可以利用連接運算新建一個字符串來改變!>>>s=“abcdefg“>>>s=s[0]+'8'+s[2::]>>>s'a8cdefg'2.重復連接格式:s*n或n*s其中s是一個字符串;n是一個正整數(shù),代表重復的次數(shù)。作用:構(gòu)建一個由其自身字符串重復連接而成的字符串。例如:>>>"ABCD"*2'ABCDABCD‘注意:連接操作的復合賦值運算符:+=、*=a+=‘a(chǎn)bc‘等價于a=a+”abc”>>>a="go">>>a*=3>>>b="Ale">>>b*=3>>>a+=b>>>a'gogogoAleAleAle'例5-3從鍵盤輸入5個字符串,將它們連接成一個字符串后輸出。s=''foriinrange(0,5):c=input("Pleaseenterastring:")s+=cprint(s)3.成員關(guān)系操作格式為:s1[not]ins2作用:用于判斷字符串s1是否屬于字符串s2,其返回值為True或False.例如:>>>"Hi"in"Hi,Python"True>>>"python"in"Hi,Python"False>>>"。"notin"Hi,Python"Truess='AEIOUaeiou's1=''foriinrange(0,10):s=input("Pleaseinputaword:")
ifs[0]inss:s1+=sprint(s1)例5-4從鍵盤輸入10個英文單詞,輸出其中以元音字母開頭的單詞。4.r/R原始字符串在字符串的第一個引號前加上字母"r"(或"R"),表示所有的字符串都是直接按照字面的意思來使用,沒有轉(zhuǎn)義或不能打印的字符。>>>print(r"hello\nworld")hello\nworld>>>print("hello\nworld")helloworld5.關(guān)系運算在進行字符串數(shù)據(jù)的比較時,遵循以下規(guī)則。(1)單個字符比較,按字符ASCII碼大小進行比較??崭?lt;數(shù)字字符<大寫字母<小寫字母<中文漢字例如:>>>'D'<'B'False>>>'8'>'2'True(2)兩個相同長度的字符串的比較是將字符串中的字符從左向右逐個比較,如果所有字符都相等,則兩個字符串相等,如果兩個字符串中有不同的字符,以最左邊的第1對不同字符的比較結(jié)果為準。(3)若兩個字符串中字符個數(shù)不等時,則將較短的字符串后面補足空格后再比較。>>>'SHANGHAI'<'SHANKONG'True>>>'WHERE'<'WHEREVER'True5.3.2字符串的處理函數(shù)str(x)函數(shù):返回x的字符串形式,
其中x可以是數(shù)字類型或其他類型。>>>str(3.5)'3.5'函數(shù)和方法的比較:相同點:都是具有獨立功能、由若干語句組成的一個可執(zhí)行程序段。區(qū)別:函數(shù)是結(jié)構(gòu)化程序設(shè)計中的概念,方法是面向?qū)ο笾械母拍?,是類中的函?shù)。函數(shù)可以通過函數(shù)名直接調(diào)用,如ord(‘A’);而對象中的方法則要通過對象名和方法名來調(diào)用。格式為:對象名.方法名(參數(shù))>>>s='abc123dfg'>>>s.upper()'ABC123DFG’>>>s'abc123dfg'5.3.3字符串處理方法1.字母大小寫轉(zhuǎn)換s.upper():全部轉(zhuǎn)換為大寫字母。s.lower():全部轉(zhuǎn)換為小寫字母。s.swapcase():字母大小寫互換。s.capitalize():首字母大寫,其余小寫。s.title():每個單詞的首字母均大寫。5.3.3字符串的常用方法>>>'Abc123Dfg'.upper()'ABC123DFG'>>>'Abc123Dfg'.lower()'abc123dfg'>>>'Abc123Dfg'.swapcase()'aBC123dFG'>>>'Abc123Dfg'.capitalize()'Abc123dfg'>>>'Abc123dfg'.title()'Abc123Dfg'>>str="Hello">>>str.upper()'HELLO'>>>str.lower()'hello'>>>"hello,kitty".title()'Hello,Kitty'>>>"hello,kitty".capitalize()'Hello,kitty'>>>"Hello,Kitty".swapcase()'hELLO,kITTY'2.字符串對齊處理s.ljust(width,[fillchar]):輸出width個字符,s左對齊,右邊不足部分用fillchar填充,默認用空格填充。s.rjust(width,[fillchar]):輸出width個字符,s右對齊,左邊不足部分用fillchar填充,默認用空格填充。s.center(width,[fillchar])輸出width個字符,s中間對齊,兩邊不足部分用fillchar填充,默認用空格填充。s.zfill(width):把s變成width長,并且右對齊,左邊不足部分用0補齊。>>>'Abc123dfg'.ljust(20,'*')'Abc123dfg**********'>>>'Abc123dfg'.rjust(20,'*')'**********Abc123dfg'>>>'Abc123dfg'.center(20,'*')'*****Abc123dfg*****'>>>'Abc123dfg'.zfill(20)'0000000000Abc123dfg'用鍵盤輸入字符串s,按要求輸出到屏幕。格式要求:寬度位30個字符,以星號填充,居中對齊。如果輸入字符串超出30位,則全部輸出。、例如:用鍵盤輸入字符串s:”Congratulations”,屏幕輸出:*******Congratulations********方法1:print('{:*^30}'.format(s))方法2:s.center(30,'*')3.字符串查找s.find(substr,[start,[end]]):返回s中出現(xiàn)substr的第1個字符的編號,如果s中沒有substr則返回-1。start和end作用就相當于在s[start:end]中搜索。s.index(substr,[start,[end]]):與find()相同,只是在s中沒有substr時,會返回一個運行時錯誤。s.rfind(substr,[start,[end]]):返回s中最后出現(xiàn)的substr的第1個字符的編號,如果s中沒有substr則返回-1,也就是說從右邊算起的第1次出現(xiàn)的substr的首字符編號。>>>'12341234123'.find('23',4)5>>>'12341234123'.index('23')1>>>'12341234123'.rfind('23',4,8)5s.rindex(substr,[start,[end]]):與rfind()相同,只是在s中沒有substr時,會返回一個運行時錯誤。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。>>>'12341234123'.rindex('23')9>>>'12341234123'.count('23')3>>>'12341234123'.startswith('23',5)True>>>'12341234123'.endswith('3')True>>>s="Hi,Python!Hi,C!">>>s.find("Hi")0>>>s.rfind("Hi")10>>>s.count("Hi")2>>>s.startswith("Hi")True>>>s.startswith("Hi",3)False>>>s.endswith("C!")True4.字符串替換s.replace(oldstr,newstr,[count]):把s中的oldstar替換為newstr,count為替換次數(shù)。這是替換的通用形式,還有一些函數(shù)進行特殊字符的替換。s.strip([chars]):把s中前后chars中有的字符全部去掉,可以理解為把s前后chars替換為None。默認去掉前后空格。>>>'12341234123'.replace('23',"ab",2)'1ab41ab4123'>>>'*1234*1234*123*'.strip('*')'1234*1234*123's.lstrip([chars]):把s左邊chars中有的字符全部去掉。默認去掉左邊空格。s.rstrip([chars]):把s右邊chars中有的字符全部去掉。默認去掉右邊空格。>>>'*1234*1234*123*'.lstrip('*')'1234*1234*123*'>>>'*1234*1234*123*'.rstrip('*')'*1234*1234*123'5.字符串的拆分與組合s.split([sep,[maxsplit]]):以sep為分隔符,把字符串s拆分成一個列表。默認的分隔符為空格。maxsplit表示拆分的次數(shù),默認取-1,表示無限制拆分。>>>'蘋果香蕉桔子葡萄'.split()['蘋果','香蕉','桔子','葡萄']>>>'蘋果香蕉桔子葡萄'.split('',1)['蘋果','香蕉桔子葡萄']s.join(seq):把seq代表的序列組合成字符串,用s將序列各元素連接起來。>>>''.join(['a','b','c','d'])'abcd'>>>s="abcd">>>s=list(s)>>>s[1]='8'>>>s=''.join(s)>>>s'a8cd’注意:修改字符串的方法:6.字符串類型測試字符串類型測試函數(shù)返回的都是邏輯值。s.isalnum():是否全是字母和數(shù)字,并至少有一個字符s.isalpha():是否全是字母,并至少有一個字符s.isdigit():是否全是數(shù)字,并至少有一個字符s.isspace():是否全是空格,并至少有一個字符s.islower():s中的字母是否全是小寫s.isupper():s中的字母是否便是大寫s.istitle():s是否是首字母大寫>>>"HelloWorldHelloPython".isalpha()False>>>"python3".isalnum()True>>>"HelloworldHellopython".istitle()False>>>"HelloWorldHelloPython".istitle()True編寫程序,輸入一段英文句子,統(tǒng)計其字符個數(shù),并統(tǒng)計出其包含多少個單詞。如輸入“Ilovepython!”,則輸出Thelengthis:14,Thecountis:3。s=input("請輸入一段英文:")#將以下代碼補充完整....................print("Thelengthis:%.f"%len)print("Thecountis:%.f"%count)5.3.4字符串類型的格式化1.format方法格式:
模板字符串.format(參數(shù)0,參數(shù)1,參數(shù)2…)模板字符串由一系列槽{}組成。作用:
將各輸出項按照序號替換到格式字符串的槽中(序號從0開始編號)。>>>'{0:.2f},{1}'.format(3.145,500)'3.15,500'槽{}內(nèi)的格式控制符格式:{<參數(shù)序號>:<填充字符><對齊方式><輸出寬度><,><.精度><類型>}填充字符:配合“輸出寬度”使用,當參數(shù)的寬度小于輸出寬度時,要用填充的字符補滿。缺省時填充空格。例如:“{0:*^10.2f}”.format(3.1415926)對齊方式:控制對齊方式,配合“輸出寬度”使用。<:左對齊>:右對齊(默認)^:居中輸出寬度:指定格式化后的字符串所占的寬度逗號:為數(shù)字添加千分位分隔符精度:指定小數(shù)位的精度類型:字符串:s整數(shù)類型:b(二進制),c(Unicode字符),d(十進制),o(八進制),x或X(十六進制)浮點數(shù)類型:e或E(科學計數(shù)法),f(浮點數(shù),默認保留小數(shù)點后6位),%(浮點數(shù)的百分比形式)>>>"{0:*>10.2f}".format(3.1415926)'******3.14'>>>"{:=^20}".format("PYTHON")'=======PYTHON======='>>>"{:10x}".format(33)'21'>>“六年級1班的數(shù)學平均成績?yōu)閧:.2f},優(yōu)秀率為{:.2%}".format(91.1267,0.1534)'六年級1班的數(shù)學平均成績?yōu)?1.13,優(yōu)秀率為15.34%'>>>"{0:e},{0:.2E}".format(3.1415926)'3.141593e+00,3.14E+00'2.f-string格式化和format方法一樣,都要使用占位符{},它可以把變量、表達式寫到占位符{}中,變量、表達式的值會替換掉占位符。>>>price,num=8,3>>>print(F"這個商品的單價是{price}元,數(shù)量是{num},總計{price*num}元")這個商品的單價是8元,數(shù)量是3,總計24元{變量或表達式:<填充字符><對齊方式><輸出寬度><.精度><類型>}若要給數(shù)據(jù)設(shè)置格式:>>>pi=3.1415926>>>print(f"{pi:*^10.2f}")***3.14***假設(shè)變量a是一個浮點數(shù),要遵照"a=xxx.xx"的格式(小數(shù)點后保留兩位)輸出變量a,以下寫法正確的是()(A)print("a=35.45") (B)print("{.2f}".format(a))(C)print("a={:.2f}".format(a)) (D)print("a={}".format(a))用鍵盤輸入字符串s,按要求輸出到屏幕。格式要求:寬度位30個字符,以星號填充,居中對齊。如果輸入字符串超出30位,則全部輸出。、例如:用鍵盤輸入字符串s:”Congratulations”,屏幕輸出:*******Congratulations********程序代碼如下:#請在______處使用一行代碼或表達式替換#注意不要修改其他代碼s=input('請輸入一個字符串:')print(“_________”.format(s))答案:C{:*^30}5.6字符串應用舉例例5-11輸入一個字符串,每次去掉最后面的字符并輸出。程序如下:s=input()foriinrange(-1,-len(s),-1):print(s[:i])輸入:hello輸出:hellhelhehline1=input()line2=""forc1inline1:ifc1.isalpha():i=ord(c1)j=i+5if(j>ord("z")or(j>ord("Z")andj<ord("Z")+6)):j-=26c2=chr(j)line2+=c2else:line2+=c1print(line2)例5-12翻譯密碼。為了保密,常不采用明碼電文,而用密碼電文,按事先約定的規(guī)律將一個字符轉(zhuǎn)換為另一個字符,收報人則按相反的規(guī)律轉(zhuǎn)換得到原來的字符。例如,將字母“A”→“F”,“B”→“G”,“C”→“H”,即將一個字母變成其后第5個字母。例如,“HeisinBeijing.”應轉(zhuǎn)換為“MjnxnsGjnonsl.”。例5-14從鍵盤輸入幾個數(shù)字,用逗號分隔,求這些數(shù)字之和。分析:輸入的數(shù)字當作一個字符串來處理,首先分離出數(shù)字串,再轉(zhuǎn)換成數(shù)值,這樣就能求和。s=input('請輸入幾個數(shù)字(用逗號分隔)')d=s.split(',')sum=0forxind:sum+=float(x)print('sum=',sum)請輸入幾個數(shù)字(用逗號分隔)1,2,3,4,5sum=15.05.4正則表達式正則表達式是一種字符串的匹配方法,它能夠用來描述一種字符串的模式。5.4.1正則表達式的元字符例:1.匹配身份證:(^\d{17}([0-9]|X|x)$),18位身份證號碼,最后一位是校驗位,可能為數(shù)字或字符X.2.匹配國內(nèi)固定電話號碼:\d{3,4}-\d{7,8},3.匹配特定數(shù)字^[1-9]\d*$//匹配正整數(shù)^-[1-9]\d*$//匹配負整數(shù)^-?[1-9]\d*$//匹配整數(shù)^[1-9]\d*|0$//匹配非負整數(shù)(正整數(shù)+0)^-[1-9]\d*|0$//匹配非正整數(shù)(負整數(shù)+0)^[1-9]\d*.\d*|0.\d*[1-9]\d*$//匹配正浮點數(shù)^-([1-9]\d*.\d*|0.\d*[1-9]\d*)$//匹配負浮點數(shù)^-?([1-9]\d*.\d*|0.\d*[1-9]\d*|0?.0+|0)$//匹配浮點數(shù)4.匹配特定字符串:^[A-Za-z]+$//匹配由26個英文字母組成的字符串^[A-Z]+$//匹配由26個英文字母的大寫組成的字符串^[a-z]+$//匹配由26個英文字母的小寫組成的字符串^[A-Za-z0-9]+$//匹配由數(shù)字和26個英文字母組成的字符串^\w+$//匹配由數(shù)字、26個英文字母或者下劃線組成的字符串5.日期格式:^\d{4}-\d{1,2}-\d{1,2}5.4.2正則表達式模塊在Python中,正則表達式的功能通過re模塊來實現(xiàn)。re模塊提供各種正則表達式的匹配操作,在文本解析、復雜字符串分析和信息提取時是一個非常有用的工具。1.正則表達式的兩種書寫方式
(1)用“re.函數(shù)名(參數(shù))”調(diào)用函數(shù),直接在參數(shù)里書寫正則表達式。(2)先用pile()函數(shù)將一個字符串形式的正則表達式編譯為正則表達式對象,然后使用正則表達式對象提供的方法進行字符串處理。語法格式如下:對象名=pile(pattern,flags=0)參數(shù)
pattern可以取的值如下所示:
re.I、re.IGNORECASE:忽略大小寫。re.M、re.MULTILINE:多行模匹配模式re.S、re.DOTALL:匹配包括換行在內(nèi)的所有字符。re.L、re.LOCALE:做本地化識別(locale-aware)匹配。re.U、re.UNICODE:根據(jù)Unicode字符集解析字符,這個標志影響\w、\W、\b、\B、\d、\D。re.X、re.VERBOSE:詳細模式。【例5-4】判斷用戶輸入的數(shù)據(jù)是否為整數(shù)importrea=input("請輸入一個整數(shù):")ifre.match("^-?[1-9]\d*$",a)!=None:print("輸入合法")else:print("輸入非法")【例5-5】用pile方法改寫例5-4。importrea=input("請輸入一個整數(shù):")regex=pile("^-?[1-9]\d*$")ifregex.match(a)!=None:print("輸入合法")else:print("輸入非法")2.字符匹配和搜索
(1)match()格式1:re.match(pattern,string,flags=0)格式2:正則表達式對象.match(string[,pos[,endpos]])【例5-6】re.match()函數(shù)舉例importrea="abc123def"m=re.match("([a-z]*)([0-9]*)([a-z]*)",a)ifm!=None:print(m.group())print(m.group(0))print(m.group(1))print(m.group(2))print(m.group(3))else:print("沒有匹配到")(2)search()函數(shù)格式1:re.search(pattern,string,flags=0)格式2:正則表達式對象.search(string[,pos[,endpos]])【例5-8】match函數(shù)和search函數(shù)的比較importres="howDOyoudo?"m1=re.match("DO",s,re.M|re.I)m2=re.search("DO",s,re.M|re.I)ifm1:print(m1.group(),m1.span())else:print("match=None")ifm2:print(m2.group(),m2.span())else:print("search=None")(3)findall()函數(shù)格式1:re.findall(pattern,string,flags=0)格式2:正則表達式對象.findall(string[,pos[,endpos]])【例5-9】findall函數(shù)舉例importrer=re.findall("\w+","HappyNewYear,2023")print(r)(4)finditer()函數(shù)格式1:re.finditer(pattern,string,flags=0)格式2:正則表達式對象.finditer(string[,pos[,endpos]])【例5-10】finditer函數(shù)舉例importrer=re.finditer("\w+","HappyNewYear")forxinr:print(x.group(),x.span())3.替換匹配的子串(1)sub()函數(shù)格式1:re.sub(pattern,repl,string,count=0,flags=0)格式2:正則表達式對象.sub(repl,string,count=0)【例5-11】把一個電話號碼"0086-791-8127312"中的-字符刪掉importrephone="0086-791-8127312"phonenum=re.sub("\D","",phone)print("電話號碼是:",phonenum)(2)subn()函數(shù)格式
1:re.subn(pattern,repl,string,count=0,flags=0)格式
2:正則表達式對象.subn(repl,string,count=0)【例5-12】用subn()函數(shù)把一個電話號碼"0086-791-8127312"中的-字符刪掉。importrephone="0086-791-8127312"pattern=pile("\D")phonenum=pattern.subn("",phone,1)print("電話號碼是:",phonenum)4.字符分割split()函數(shù)格式1:re.split(pattern,string,maxsplit=0,flags=0))格式2:正則表達式對象.split(string,maxsplit=0)【例5-13】將一個IP地址的四個數(shù)字拆分出來importreip="81"pattern=pile("\D")ipnum=pattern.split(ip)print(ipnum)5.5字符串應用舉例【例5-14】從鍵盤輸入一個18位的身份證號碼,把其中的出生日期截取出來。分析:首先用正則表達式驗證輸入的身份證號碼是否符合規(guī)則,直到輸入合法的身份證號碼。然后用字符串的切片截取生日即可。importreID=input("請輸入18位的身份證號碼:")m=re.match("^\d{17}([0-9]|X|x)$",ID)whilem==None:print("身份證號碼不對,請重新輸入!")ID=input("請輸入18位的身份證號碼:")m=re.match("^\d{17}([0-9]|X|x)$",ID)year=ID[6:10:]month=ID[10:12:]day=ID[12:14:]print("出生日期為:"+year+"年"+month+"月"+day+"日")【例5-15】字符串加密。s1=input("請輸入原字符串:")s2=""forcins1:ifc.isalnum():ifc.isupper():s2+=chr((ord(c)-ord('A')+2)%26+ord('A'))ifc.islower():s2+=chr((ord(c)-ord('a')+2)%26+ord('a'))ifc.isdigit():s2+=chr((ord(c)-ord('0')-3+10)%10+ord('0'))else:s2+=cprint("加密后的字符串為:",s2)第6章復合數(shù)據(jù)類型第6章復合數(shù)據(jù)類型6.1序列的通用操作6.2列表6.3元組6.4集合6.5字典復合數(shù)據(jù)類型序列類型字符串列表元組集合類型集合映射類型字典序列類型是一個元素向量,元素之間存在先后關(guān)系,通過序列中的索引(位置編號)來訪問數(shù)據(jù)元素,元素之間不排他可重復。映射類型是“鍵-值”數(shù)據(jù)項的組合,每個元素是一個鍵值對,表示為(key,value)。集合類型是一個元素集合,元素之間無序、不重復。復合數(shù)據(jù)類型概述6.1序列的通用操作序列類型包括字符串(str)、列表(list)和元組(tuple)。a=“Monkey“#字符串b==['Alice','Ben','Candy','Mary','Lucy’]#列表c=(=(“Rat”,“OX”,“Tiger”,“Rabbit”,“Dragon”,“Snake”)#元組序列類型都可以進行索引、切片、序列相加、序列相乘以及成員資格檢查等操作。Python還有計算序列長度、找出最大元素和最小元素等內(nèi)置函數(shù)。6.1.1序列的索引序列名[索引]有兩種索引方式:正向索引和反向索引例如:>>>str1="thisisastring">>>Lst1=["2022100123","張三","男",18]>>>tup1=("物理","化學","地理","生物","歷史")>>>print(str1[0],Lst1[-1],tup1[3])t18生物6.1.2序列的切片切片就是取出序列中某個范圍內(nèi)的元素,得到一個新的序列,原序列不變。一般格式為:序列名[M:N:K]>>>Lst2=[1,2,3,4,5,6,7,8,9]>>>Lst2[1:4]#步長缺省為1,索引[1,4)結(jié)果:[2,3,4]>>>Lst2[:]#同lst2[::],步長缺省為1,取出從前往后所有元素[1,2,3,4,5,6,7,8,9]>>>Lst2[::-1]#步長為-1,取出從后往前所有元素[9,8,7,6,5,4,3,2,1]>>>Lst2[:-2:2]#步長為2,M缺省為0,取出從[0,-2)步長為2的元素[1,3,5,7]>>>Lst2[3::2]#步長為2,取出從3到末尾的步長為2的元素[4,6,8]>>>lst2[-1::-2]#步長為-2,N為第一個元素,取出從-1到0步長為-2的元素[9,7,5,3,1]6.1.3序列的計算1.序列相加使用加號+可以進行同類型序列的連接操作。例如:>>>[1,2,3]+['a','b','c']#列表相加[1,2,3,'a','b','c']>>>(4,5,6)+(7,8,9)#元組相加(4,5,6,7,8,9)>>>"abc"+"123"#字符串相加'abc123'6.1.3序列的計算2.序列相乘用整數(shù)n乘以序列會產(chǎn)生一個新的序列,在新序列中,原序列將重復n次。當n<1,將返回空序列。例如:>>>a=(1,2,3)>>>2*a(1,2,3,1,2,3)>>>-1*a()6.1.3序列的計算3.成員資格檢查成員資格檢查用于檢查一個值是否在序列中,有in和notin兩個運算符,返回True或False。例如:>>>tup1=("物理","化學","地理","生物","歷史")>>>"音樂"intup1False>>>"音樂"notintup1True6.1.4序列處理函數(shù)1.len()、max()、min()函數(shù)len(s):返回序列s的元素個數(shù)min(s):返回序列s的最小元素max(s):返回序列s的最大元素以下Python表達式中,哪項的值與其它三項不同(
)。A.len("Nicetomeetyou".split()) B.len("Nice".split())C.sum([1,2,1,0])
D.max([1,2,3,4])2.index方法和count方法s.index(x[,i[,j]]):返回序列s中索引為第i到第j-1項元素中第一次出現(xiàn)元素x的位置。s.count(x):返回序列s中出現(xiàn)x的次數(shù)。6.2列表列表(list)是Python中最常用的復合數(shù)據(jù)類型,可以完成大多數(shù)復合數(shù)據(jù)結(jié)構(gòu)的操作。列表元素是可變的,也就是列表中的元素的值可修改,也可以增加元素或刪除元素。字符串和元組的元素是不可變的。所以除了序列的通用操作外,列表還有許多專有的操作6.2.1列表的創(chuàng)建1.用[]創(chuàng)建列表列表是用方括號“[]”括起來、用逗號分隔的元素序列>>>elist=[]#創(chuàng)建空列表>>>names=['Alice','Ben','Candy','Mary','Lucy']>>>stud=["2022100212","張三",18,[88,77,89]]>>>print("{}的三門課的成績是{},{},{}".format(stud[1],stud[3][0],stud[3][1],stud[3][2]))張三的三門課的成績是88,77,89>>>names[::2]#通過切片訪問列表中的元素['Alice','Candy','Lucy']6.2.1列表的創(chuàng)建2.用list()函數(shù)創(chuàng)建列表列表也可以用list()函數(shù)將range()對象、元組、字符串或其他可迭代類型的數(shù)據(jù)轉(zhuǎn)換為列表。>>>numlist=list(range(1,6))#創(chuàng)建一個包含1到5的整數(shù)列表>>>numlist[1,2,3,4,5]>>>strlist=list("hello")#將字符串轉(zhuǎn)為列表>>>strlst['h','e','l','l','o']>>>tlist=list((1,2,3,4))#將元組(1,2,3,4)轉(zhuǎn)為列表>>>tlist[1,2,3,4] >>>elist2=list()#創(chuàng)建空列表>>>elist2[]列表的注意事項:列表必須通過顯示的數(shù)據(jù)賦值才能生成,簡單將一個列表變量賦值給另一個列表變量不會生成新的列表通過切片操作可以生成新的列表,不會改變原來的列表>>>lst1=[70,80,90]>>>lst2=lst1
>>>id(lst1),id(lst2)(50784384,50784384)>>>lst2[0]=72>>>lst1[72,80,90]>>>x=[1,2,3,4,5,6]>>>y=x[:]>>>y[1,2,3,4,5,6]>>>id(x),id(y)(51019904,51370112)6.2.2列表的專有操作1.列表元素的添加ls.append(x)方法:在列表末尾追加元素ls.insert(i,x)方法:在列表第i個位置增加新元素xls.extend(lst)方法:將列表lst元素追加到列表ls尾部“+=”運算符:
ls+=lst將列表lst元素追加到列表ls尾部“*=”運算符:ls*=n更新列表ls,其元素重復n次append、insert、extend、+=、*=這些操作在添加了新元素后,內(nèi)存地址沒有發(fā)生變化,屬于原地操作,不會創(chuàng)建新的列表對象>>>names=['Alice','Ben']>>>id(names)51371264>>>names.append("Yoyo")#['Alice','Ben','Yoyo']>>>names.insert(2,"Lily")
#['Alice','Ben','Lily','Yoyo']>>>n=["張三","李四"]>>>names.extend(n)#['Alice','Ben','Lily','Yoyo','張三','李四’]>>>n1=["王五"]>>>names+=n1#與names=names+n1不等價#['Alice','Ben','Lily','Yoyo','張三','李四','王五’]>>>names*=2#結(jié)果為:[‘Alice’,‘Ben’,‘Lily’,‘Yoyo’,‘張三’,‘李四’,‘王五’,'Alice','Ben','Lily','Yoyo','張三','李四','王五’]>>>id(names)51371264下列Python程序的運行結(jié)果是(
)。s=[1,2,3,'a']s.append([4,5])print(len(s))A.2
B.4
C.5
D.66.2.2列表的專有操作2.列表元素的刪除del語句dells:刪除列表ls對象dells[i]:刪除列表ls第i項的元素dells[i:j:k]:刪除列表ls第i到第j-1項以k為步長的元素ls.pop(i)方法:返回列表ls第i項元素并刪除該元素,缺省i刪最后一個ls.remove(x)方法:將列表中第一個出現(xiàn)的元素x刪除ls.clear()方法:
刪除列表ls中的所有元素,把ls變?yōu)榭樟斜?.2.2列表的專有操作>>>names=['Alice','Ben','Candy','Mary','Lucy']>>>delnames[0]>>>names['Ben','Candy','Mary','Lucy']>>>delnames[2:]>>>names['Ben','Candy']>>>delnames>>>names=['Alice','Ben','Candy','Mary','Lucy']>>>names.pop()'Lucy'>>>names.pop(0)'Alice'>>>names['Ben','Candy','Mary’]>>>names=['Alice','Ben','Candy','Ben','Lucy']>>>names.remove('Ben')>>>names['Alice','Candy','Ben','Lucy’]>>>names=['Alice','Ben','Candy','Mary','Lucy']>>>names.clear()>>>names[]以下代碼的輸出結(jié)果是(
)。list1=[1,2,3,4]list2=list1list2.clear()print(list1)A.[1,2,3,4]
B.1,2,3,4
C.[]
D.錯誤6.2.2列表的專有操作3.列表元素的修改可以通過索引或切片直接修改列表元素的值。ls[i]=xls[i:j:k]=lst當使用切片賦值將一個列表賦給另一個列表時,Python不要求兩個列表長度一樣,但遵循“多增少減”的原則??梢酝ㄟ^賦給更多或更少元素實現(xiàn)列表元素的插入或刪除6.2.2列表的專有操作>>>a=[1,2,3,4,5]>>>a[2::]=[7,8,9,10]#把下標從2到所有的元素改為[7,8,9,10]>>>a[1,2,7,8,9,10]>>>a[0:2]=[6]#把下標為0和1的元素改[6]>>>a[6,7,8,9,10]6.2.2列表的專有操作4.對列表進行排序和逆置ls.sort(key=None,reverse=False):reverse=True表示降序排列,reverse參數(shù)缺省,或reverse=False表示升序排列。key參數(shù)用于指定一個函數(shù),此函數(shù)將在每個元素比較前被調(diào)用。ls.reverse():
反轉(zhuǎn)逆置列表ls中的元素。內(nèi)置函數(shù)sorted(ls[,reverse=False]):將列表ls默認升序排列后生成的新列表返回,原列表ls的值不變。若reverse=True,表示降序。6.2.2列表的專有操作>>>s=[23,21,45,67,12,9]>>>s.reverse()>>>s[9,12,67,45,21,23]>>>s.sort()>>>s[9,12,21,23,45,67]>>>s.sort(reverse=True)>>>s[67,45,23,21,12,9]內(nèi)置函數(shù)sorted(ls[,reverse=False])的舉例如下:>>>s=[23,21,45,67,12,9]>>>t=sorted(s)>>>s[23,21,45,67,12,9]>>>t[9,12,21,23,45,67]字符串str="catdogtiger",以下程序的輸出結(jié)果是:(
)。str="catdogtiger"ls=str.split()ls.reverse()print(ls)A.'tiger','dog','cat’B.tigerdogcatC.NoneD.['tiger','dog','cat']6.2.3遍歷列表1.用for循環(huán)語句遍歷列表格式:for變量名in列表名:語句塊【例
6?1】用for循環(huán)遍歷列表,將列表中的每個元素星期幾的英文全稱改為縮寫,輸出時用空格隔開。week_list=["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"]i=0foriteminweek_list:week_list[i]=item[0:3]i=i+1foriteminweek_list:print(item,end="")6.2.3遍歷列表2.用while循環(huán)語句遍歷列表用while循環(huán)語句遍歷列表時,需要先計算列表的長度,將獲得的長度作為循環(huán)的條件,用索引訪問列表元素。【例
6?2】用列表的方法輸出斐波那契數(shù)列:1,1,2,3,5,8…前10項,并計算這10項的和。lst=[1,1]i=2whilei<=10:lst.append(lst[i-1]+lst[i-2])i=i+1print(lst)i=0s=0whilei<len(lst):s+=lst[i]i=i+1print(s)lst=[1,1]i=2whilei<=10:lst.append(lst[i-1]+lst[i-2])i=i+1print(lst)print(sum(lst))6.2.4列表推導式列表推導式可以利用range對象、元組、列表、字典和集合等數(shù)據(jù)類型,快速生成一個滿足條件的列表。語法格式如下:[表達式for迭代變量in迭代對象
[if條件表達式]]其中[if條件表達式]可缺省。將每個符合if條件的迭代變量計算一次表達式的值,這些值就是新生成的列表中的每個元素。1.不加if條件的列表推導式創(chuàng)建一個1到10的整數(shù)列表,代碼如下:>>>a=[x+1forxinrange(10)]>>>a[1,2,3,4,5,6,7,8,9,10]>>>importrandom>>>b=[random.randint(0,100)foriinrange(10)]>>>b[76,17,98,10,56,22,43,2,66,86]2.加if條件的列表推導式創(chuàng)建一個1到20間奇數(shù)的平方的列表,代碼如下:>>>b=[x*xforxinrange(1,21)ifx%2==1]>>>b[1,9,25,49,81,121,169,225,289,361]3.多重循環(huán)的列表推導式上面的列表推導式都只包含一個循環(huán),實際上可以使用多重循環(huán),舉例如下:>>>c=[[x,y]forxinrange(3)foryinrange(3)]>>>c[[0,0],[0,1],[0,2],[1,0],[1,1],[1,2],[2,0],[2,1],[2,2]]【例63】用隨機函數(shù)生成n個0-100的隨機整數(shù),降序排列輸出。分析:用列表推導式生成由n個隨機數(shù)組成的列表,然后用列表的方法sort對數(shù)據(jù)進行排序。代碼如下:importrandomrandom.seed()n=eval(input("輸入要生成多少個隨機數(shù):"))alist=[random.randint(0,100)foriinrange(n)]print("排序前:",alist)alist.sort(reverse=True)print("排序后:",alist)6.3元組Python中元組是序列類型中比較特殊的類型,因為它一旦創(chuàng)建就不能被修改。元組類型在表達固定數(shù)據(jù)項、函數(shù)多返回值、多變量同步賦值、循環(huán)遍歷等情況下十分有用。6.3.1元組的基本操作1.創(chuàng)建元組創(chuàng)建元組用使用圓括號“()”,所有元素放在一對圓括號“()”中,并用逗號“,”分隔;也可用tuple()函數(shù)將range()對象、列表、字符串或其他可迭代類型的數(shù)據(jù)轉(zhuǎn)為元組。>>>tup0=()#空元組>>>tup1=("Rat","OX")#用圓括號創(chuàng)建元組>>>tup2="Horse","Sheep"#圓括號可省略>>>tup3=(1,2,3,"a","b","c")#元組中包含不同類型的數(shù)據(jù)>>>tup4=(100,)#只有一個元素時,逗號不能省略>>>tup5=tuple(range(5))>>>list1=[70,80,90,99]>>>tup6=tuple(list1)>>>tup7=tuple("hello")6.3.1元組的基本操作2.訪問元組可以使用下標索引和切片來訪問或獲取指定的元素,但只能訪問不能修改元素的值>>>tup6=(70,80,90,99)>>>print(tup6[0],tup6[-1],tup6[1:3])7099(80,90)>>>tup6[3]=100Traceback(mostrecentcalllast):File"<pyshell#6>",line1,in<module>tup6[3]=100TypeError:'tuple'objectdoesnotsupportitemassignment下面代碼的輸出結(jié)果是(
)。t1=('a','b','c',['a','b','c'])t1[-1][-1]='d'print(t1)A.('a','b','c',’d’)B.('a','b','c',['a','b','d’])
C.('a','b','c',['a','b','c'],'d')D.異常6.3.1元組的基本操作3.元組的常用內(nèi)置函數(shù)和操作符元組可以使用所有適用于序列的通用操作符和函數(shù),元組的常用內(nèi)置函數(shù)有l(wèi)en()、max()、min()等,通用操作符+、*、in、notin同6.1.3節(jié)4.刪除元組元組是不可變序列,無法刪除元組中的元素,只能使用del命令刪除整個元組對象【例67】獲取用戶輸入的一組數(shù)據(jù),采用逗號分隔輸入,輸出其中的最大值。data=eval(input("請輸入一組數(shù)據(jù),以逗號分隔:"))m=data[0]foriindata:ifi>m:m=iprint("最大值是:",m)data=eval(input("請輸入一組數(shù)據(jù),以逗號分隔:"))print("最大值是:",max(data))6.3.2元組與列表的轉(zhuǎn)換元組和列表可以通過list()函數(shù)和tuple()函數(shù)實現(xiàn)相互轉(zhuǎn)換。如果想要修改其元素值,可以將元組轉(zhuǎn)換為列表,修改完畢后,再轉(zhuǎn)換為元組。>>>tup=(1,2,3,4)>>>lst=list(tup)>>>lst.append(5)>>>lst[1,2,3,4,5]>>>tup=tuple(lst)>>>tup(1,2,3,4,5)6.4集合集合是包含0個或多個數(shù)據(jù)元素的無序組合。集合中的元素不可重復,元素類型只能是整數(shù)、浮點數(shù)、字符串、元組等不可變數(shù)據(jù)類型,且這些數(shù)據(jù)元素是無序的,沒有索引位置的概念,不能切片。Python中的集合類型與數(shù)學中集合的概念一致,可對其進行交、并、差等集合運算6.4.1集合的創(chuàng)建1.使用花括號{}將多個用逗號隔開的數(shù)據(jù)括起來2.使用set()函數(shù),它將range()對象、列表、字符串或其他可迭代類型的數(shù)據(jù)轉(zhuǎn)換為集合,但會將重復的元素刪掉>>>s1={1,2,3,4,5}>>>s2=set("happy")>>>s3=set([1,2,3,5,2])>>>s4=set()#空集合,注意不是{},{}表示空字典。>>>s1,s2,s3,s4({1,2,3,4,5},{'p','a','y','h'},{1,2,3,5},set())設(shè)a=set([1,2,2,3,3,3,4,4,4,4]),則a.remove(4)的值是()。A.{1,2,3}B.{1,2,2,3,3,3,4,4,4}C.{1,2,2,3,3,3}D.[1,2,2,3,3,3,4,4,4]以下不能創(chuàng)建集合的語句是()。A.s1={}B.s2=set()C.s3=set(“abcd”)D.s4={1,2,3,4}6.4.2集合運算有4種基本操作:交集(&)、并集(|)、差集(-)、補集(^)運算符功能描述S&T或S.intersection(T)交集:返回一個新集合,包含同時在集合S和T中的元素。S|T或S.union(T)并集:返回一個新集合,包含集合S和T中的所有元素S-T或S.difference(T)差集:返回一個新集合,包含在集合S中但不在集合T中的元素S^T或S.symmetric_difference_update(T)補集:返回一個新集合,包含集合S和T中的元素,但不包含同時在這兩集合中的元素S<=T或S.issubset(T)子集測試:若S與T相同或S是T的子集,返回True,否則返回False。S<T表示S是否是T的真子集S>=T或S.issuperset(T)超集測試:若S與T相同或S是T的超集,返回True,否則返回False。S>T表示S是否是T的真超集set1=set("字典"),set2=set("集合"),set1|set2的結(jié)果可能是()。
A.{"字典集合"}B.{"典","字","集","合"}C."字典集合"D.["字典集合"]6.4.3集合的常用方法
方法或函數(shù)功能描述S.add(x)添加元素:若數(shù)據(jù)元素x不在集合S中,將x添加到S中S.clear()清空元素:移除集合S中的所有元素S.copy()復制集合:返回集合S的一個副本S.pop()隨機刪除元素:隨機返回并移除一個元素,S為空時產(chǎn)生KeyError異常S.discard(x)刪除指定元素:若x在集合S中,移除該元素;x不存在時,不報異常S.remove(x)刪除指定元素:若x在集合S中,移除該元素;x不存在時,產(chǎn)生KeyError異常S.isdisjoint(T)若集合S和T沒有相同元素,返回True,否則返回Falselen(S)返回集合S的元素個數(shù)xinS若x是S的元素,返回True,否則返回FalsexnotinS若x不是S的元素,返回True,否則返回False【例
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 讀書演講稿模板錦集6篇
- 2023元旦文藝晚會主持詞開場白大全10篇
- 大學生建筑實習報告范文八篇
- 上半年工作總結(jié)(集合15篇)
- 小學工作計劃(5篇)
- 會計實習心得體會15篇優(yōu)
- 財務(wù)專業(yè)頂崗實習報告【7篇】
- 高中作文培訓教案教育課件
- 生命 生命的課件
- 腦梗死昏迷病人的護理
- 鐵路物資組織供應、運輸、售后服務(wù)方案
- Kristen 餅干公司運營案例分析
- 設(shè)備維護保養(yǎng)培訓課件(共95頁).ppt
- EXCEL綜合上機操作題(20220127214107)
- 復合肥料配方大公開
- 奧地利全英文簡介(課堂PPT)
- 鄰近營業(yè)線施工方案)
- 頸動脈斑塊的識別與處理.ppt
- 揚州市梅嶺二年級數(shù)學上冊期末復習試卷(一)及答案
- 新西蘭旅行計劃日行程單簽證
- 三方比價單74440
評論
0/150
提交評論