第4章+字符串與正則表達式_第1頁
第4章+字符串與正則表達式_第2頁
第4章+字符串與正則表達式_第3頁
第4章+字符串與正則表達式_第4頁
第4章+字符串與正則表達式_第5頁
已閱讀5頁,還剩129頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第4章 字符串與正則表達式肖川outline字符串正則表達式正則表達式re模塊的方法正則表達式對象的方法2字符編碼ASCIIASCII1個字節(jié)128個字符組成,包括大小寫字母、數字0-9、標點符號、非打印字符(換行符、制表符等4個)以及控制字符(退格、響鈴等)組成UTF-8UTF-816個字節(jié)對世界上所有國家需要用到的字符進行了編碼GB2312GB23121個字節(jié)表示英文,2個字節(jié)表示中文中國制定的中文編碼GBKGBK對GB2312的擴充CP936CP936微軟在GBK基礎上完成的編碼34鍵盤上每個鍵盤上每個字符在計算機內部都存儲為一個整數,這個整數值就是字符在計算機內部都存儲為一個整數,這個

2、整數值就是字符的字符的ASCII碼:碼:文件編碼采用不同的編碼意味著把同一字符存入文件時,寫入的內容可能不同在Python3中,程序源文件默認為UTF-8編碼,全面支持中文。無論數字、字母、漢字,都按一個字符對待,也可以使用中文作為變量名。56字符串駐留機制Python字符串駐留機制對于短字符串,將其賦值給多個不同的對象時,內存中只有一個副本,多個對象共享該副本。長字符串不遵守駐留機制。7字符串8字符串字符串是由字符(字母、數字、漢字、其他符號)組成的一個序列。字符串必須被括在如下的一對符號里:一對單引號 一對雙引號一對三單引號一對三雙引號9例10判斷一個變量是否為字符串判斷一個變量s是否為字

3、符串使用內置函數isinstanceisinstance(s,strstr)11字符串字符串屬于不可變序列類型支持序列通用方法,包括切片操作支持特有的字符串操作方法。12課堂練習:把一個字符串分行輸出,每行1個字符13課堂練習:把一個字符串分行輸出,每行2個字符14課堂練習:把一個字符串分行輸出,每行n個字符15課堂練習:把一個字符串分m行輸出,m由用戶指定16字符串常量 import string string.string.digitsdigits #數字字符0123456789 string.string.punctuationpunctuation#標點符號!#$%&()*+,-./:

4、;?_| stringstring. .ascii_ascii_lettersletters#英文字母ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz string.string.printableprintable#可打印字符0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!#$%&()*+,-./:;?_| tnrx0bx0c stringstring. .ascii_ascii_lowercaselowercase#小寫字母abcdefghijklmnopq

5、rstuvwxyz stringstring. .ascii_ascii_uppercaseuppercase#大寫字母ABCDEFGHIJKLMNOPQRSTUVWXYZ17練習:刪除字符串中的非字母和非數字的符號18字符串轉換方法lowerlower()()得到小寫格式字符串upper()upper()得到大寫格式字符串capitalize()capitalize()得到首字母大寫格式title()title()得到每個單詞首字母大寫格式swapcase()swapcase()得到大小寫互換格式19示例輸入一個字符串,輸出大小寫互換的字符序列。要求不使用字符串對象的swapcase(.)s

6、wapcase(.)方法。20代碼21互逆的兩個函數ord(.)與chr(.)函數ord(.)ord(.):字符 ASCII碼22ASCII值值009AZaz 【del】字符字符04857659097122127函數chr(.):ASCII碼 字符自己實現大小寫字母轉換# if x in string.ascii_lowercase:009AZaz 【del】字符字符# if x in string.ascii_uppercase:23字符串聯(lián)接函數 join(.)字符串聯(lián)接join( join( ) )例: li=apple, peach, banana, pear sep=, s=sep.

7、join(li) sapple,peach,banana,pear不推薦使用 + + 連接字符串,優(yōu)先使用join()方法效率原因24join(.)舉例25練習輸入一個字符串,輸出以空格間隔的字符序列26獲取字符串表達式值內置函數evaleval( (. .) ) evaleval(3+4)7 a = 3 b = 5 evaleval(a+b)8 import math evaleval(help(math.sqrt)Help on built-in function sqrt in module math:sqrt(.) sqrt(x) Return the square root of x

8、. evaleval(math.sqrt(3)1.7320508075688772 evaleval(aa)Traceback (most recent call last): File , line 1, in eval(aa) File , line 1, in NameError: name aa is not defined27獲取字符串表達式值 a = input(Input a value:)Please input a value:_import_(os).startfile(rC:import_(os).startfile(rC:WindowsnotepadWindowsnot

9、epad.exe.exe) evaleval(a) # 運行notepad.exe程序,打開一個記事本窗口 evaleval(_import_(os).system(md testtest) 28將數字轉換成字符串 str(.)29練習:判斷是否為回文串回文串一個左右對稱的字符串abaabbaa空串30代碼1. 函數的其他寫法2. 利用該函數找回文數31代碼32列出1000以內所有的回文數33一種簡單的加密和解密加密 對明文每m位提取其字符 到達末尾則回至頭部 已經提取的不再提取 如:“abcde”,m=3 密文為: “caebd”解密 已知密文和m 如何恢復明文?34明文明文密文密文加密解密

10、35報數出圈設有編號為1n的n個人按順時針站成一個圓圈。首先從第1個人開始,按順時針從1開始報數,報到第m個人,令其出列。然后再從出列的下一個人開始,按順時針從1開始報數,報到第m個人,再令其出列,。如此下去,直到圓圈不再有人為止。求這n個人出列的順序。36解題思路假設此圈共有rest個人,對應x0, x1, x2, , xrest-1。假設這一輪報1的人對應的元素下標為 curIndex (0 = curIndex x=1235 so=%o % % x so2323 sh=%x % % x sh4d3 se=%e % % x se1.235000e+03 %s % % 6565 %s % %

11、 6533365333 %d % % 555Traceback (most recent call last): File , line 1, in %d%555TypeError: %d format: a number is required, not str53%常用格式舉例格式格式說明說明10.2f格式化浮點數,總寬度為10,四舍五入到小數點后第2位10.2e以科學計數法表示浮點數,總寬度為10,系數保留到小數點后2位5d將整數格式化為總寬度為5的十進制形式5o將整數格式化為總寬度為5的八進制形式5x將整數格式化為總寬度為5的十六進制形式5b將整數格式化為總寬度為5的二進制形式50s將

12、字符串格式化為總寬度為50的字符串,不足則補上空格50.2s截取字符串的前2位,將其格式化為總寬度為50的字符串,不足補空格-10.2f向左對齊格式化對象,若無符號(即默認)則是右對齊+10.2f格式化浮點數,如果是正數,則自動加上正號+54字符串格式化format(.)print( The The number number 0:, 0:, in hex is: in hex is: 0:#x0:#x, the number , the number 11 in in oct is oct is 1:#o1:#o .formatformat( 5555, 55 ) ( 5555, 55 )

13、)print( The The number number 1:, 1:, in hex is: in hex is: 1:#x1:#x, the number , the number 00 in in oct is oct is 0:#o0:#o . .formatformat( 5555, 55 ) ( 5555, 55 ) )print( my my name is name is namename, my age is , my age is ageage, and my QQ is , and my QQ is qqqq . .formatformat(name = (name =

14、 Dong Fuguo,Dong Fuguo,age = 37age = 37, ,qqqq = = 306467355) 306467355) )55字符串格式化format(.)position = (5,8,13)print( XX: :0000; ;Y:01Y:01; ;Z:02Z:02 . .formatformat(position(position) ) )weather = (Monday,rain),(Tuesday,sunny),(Wednesday, sunny),(Thursday,rain),(Friday,Cloudy)formatterformatter = We

15、ather Weather of of 0000 is is 0101. .formatformat # #方法對象方法對象for item in map(formatterformatter,weather): print(item)for item in weather: print(formatter(formatter(item) )56% 與 .format(.)方法的差異57查找方法findfind( (. .) )、rfindrfind( (. .) )find()和rfind方法分別用來查找一個字符串在另一個字符串指定范圍(默認是整個字符串)中首次和最后一次出現的位置,如果不存

16、在則返回-1;indexindex( (. .) )、rindexrindex( (. .) )index()和rindex()方法用來返回一個字符串在另一個字符串指定范圍中首次和最后一次出現的位置,如果不存在則拋出異常;countcount( (. .) ) count()方法用來返回一個字符串在另一個字符串中出現的次數。58字符串常用方法 s=apple,peach,banana,peach,pear s.find(peach)6 s.find(peach,7)19 s.find(peach,7,20)-1 s.rfind(p)25 s.index(p)1 s.index(pe)6 s.i

17、ndex(pear)25 s.index(ppp)Traceback (most recent call last): File , line 1, in s.index(ppp)ValueError: substring not found s.count(p)5 s.count(pp)1 s.count(ppp)059字符串分割splitsplit( (. .) )、rsplitrsplit( (. .) )split()和rsplit()方法分別用來以指定字符為分隔符,將字符串左端和右端開始將其分割成多個字符串,并返回包含分割結果的列表;split()與join()作用相反。partit

18、ion(partition(. .) )、rpartitionrpartition( (. .) )partition()和rpartition()用來以指定字符串為分隔符將原字符串分割為3部分元組,即分隔符前的字符串、分隔符字符串、分隔符后的字符串,如果指定的分隔符不在原字符串中,則返回原字符串和兩個空字符串。60字符串分割 s=apple,peach,banana,pear li=s.split(,) liapple, peach, banana, pear s.partition(,)(apple, , peach,banana,pear) s.rpartition(,)(apple,p

19、each,banana, , pear) s.rpartition(banana)(apple,peach, banana, ,pear)s = 2014-10-31 t=s.split(-) print(t)2014, 10, 31 print(map(int, t)2014, 10, 3161字符串分割對于split()split()和rsplit()rsplit()方法,如果不指定分隔符,則字符串中的任何空白符號(包括空格、換行符、制表符等等)都將被認為是分隔符,返回包含最終分割結果的列表。 s = hello world nn My name is Dong s.splitsplit(

20、)hello, world, My, name, is, Dong s = nnhello world nnn My name is Dong s.splitsplit()hello, world, My, name, is, Dong s = nnhellott world nnn My namet is Dong s.splitsplit()hello, world, My, name, is, Dong62字符串分割split()split()和rsplit()rsplit()方法還允許指定最大分割次數,例如: s = nnhellott world nnn My name is Don

21、g s.splitsplit(None,1) # None表示不指定分割符hello, world nnn My name is Dong s.rsplitrsplit(None,1)nnhellott world nnn My name is, Dong s.splitsplit(None,2)hello, world, My name is Dong s.rsplitrsplit(None,2)nnhellott world nnn My name, is, Dong s.splitsplit(None,5)hello, world, My, name, is, Dong s.splits

22、plit(None,6)hello, world, My, name, is, Dong63字符串替換查找替換 replace(replace(. .) ) s=中國,中國 print(s)中國,中國s2=s.replace(中國, 中華人民共和國) print(s2)中華人民共和國,中華人民共和國64字符串轉換生成映射表函數maketrans(.)maketrans(.)和按映射表關系轉換字符串函數translate(.)translate(.) import string table=string.maketransmaketrans(abcdef123,uvwxyz#$) s=Pytho

23、n is a greate programming language. I like it! s.translatetranslate(table)Python is u gryuty progrumming lunguugy. I liky it! s.translatetranslate(table,gtm) #第二個參數表示要刪除的字符Pyhon is u ryuy proruin lunuuy. I liky i!65字符串消減strip()strip()、rstrip()rstrip()、lstrip()lstrip()這幾個方法分別用來刪除兩端、右端或左端的空格或連續(xù)的指定字符。

24、s= abc s2=s.stripstrip( ) s2abc aaaassddf.stripstrip(a)ssddf aaaassddf.stripstrip(af)ssdd aaaassddfaaa.rstriprstrip(a)aaaassddf aaaassddfaaa.lstriplstrip(a)ssddfaaa66字符串成員判斷成員判斷 a inin abcdeTrue j inin abcdeFalses.startwithstartwith(t)、s.endswithendswith(t)判斷字符串是否以指定字符串開始或結束 import os filename for f

25、ilename in os.listdir(rc:) if filename.endswithendswith(.bmp,.jpg,.gif)67檢驗字符串是否為字母、數字等i isalunm()salunm() 檢驗字符串是否為數字或字母i isalpha()salpha() 檢驗字符串是否為字母i isdigit()sdigit() 檢驗字符串是否為數字字符i isspace()sspace() 檢驗字符串是否為空白字符i isupper()supper() 檢驗字符串是否為大寫字母i islower()slower() 檢驗字符串是否為小寫字母68舉例69分行連續(xù)輸入若干個數,輸出其中最

26、大數70連續(xù)輸入若干行字符串(以空行結束),輸出首次出現的最長行71連續(xù)輸入若干行字符串(以空行結束),輸出最后出現的最長行72連續(xù)輸入若干行字符串(以空行結束),輸出最長的那些行73統(tǒng)計文章的單詞個數。約定單詞由英文字母組成,其他字符只是用來分隔單詞。74習題3用戶輸入一個十六進制字符串,程序顯示該數2倍的值(十六進制)。界面如下,黑色為用戶輸入,藍色為程序輸出。75習題4ISBN-13是區(qū)別書籍的新標準。它使用13個數:d1d2d3d4d5d6d7d8d9d10d11d12d13。最后一位d13是一個校驗碼,它是使用下面的公式從其他幾位計算得到的: 10 - (10 - (d d1 1+3

27、+3d d2 2+ +d d3 3+3+3d d4 4+ +d d5 5+3+3d d6 6+ +d d7 7+3+3d d8 8+ +d d9 9+3+3d d1010+ +d d1111+3+3d d1212) % 10) % 10 如果校驗碼是10,就用0替換它。用戶輸入前12位,程序輸出完整的ISBN號碼。界面如右上角,黑色為用戶輸入,藍色為程序輸出。76正則表達式77正則表達式正則表達式正則表達式是字符串處理的有力工具和技術,提供了功能強大,靈活而又高效的方法處理文本:快速分析大量文本以找到找到特定的符合某些復雜規(guī)則(亦稱模式)的字符串如:1.從英文小說中查找 hi,但不能把 him

28、,high,history也找到 2.要找后面不遠處跟著一個Lucy的 hi提取、編輯、替換或刪除文本子字符串將提取的字符串添加到集合以生成報告正則表達式正則表達式就是用于描述這些規(guī)則(模式)的語言正則表達式正則表達式廣泛地應用于各種字符串處理應用程序:如網頁處理,日志文件分析等78正則表達式組成 正則表達式正則表達式是普通字符(包括轉義字符)、特殊字符(稱為元字符元字符)及其不同組合來構成的 正則表達式是個字符串1.從英文小說中查找 hi,但不能把him,high,history也找到正則表達式:bbhihibb 2.要找后面不遠處跟著一個Lucy的 hi正則表達式:bbhib.*bLucy

29、b元字符元字符普通字符普通字符79普通字符(包括轉義字符)最基本的正則表達式由單個單個或多個多個普通字符組成,用以匹配字符串中對應的單個或多個普通字符普通字符包括ASCII字符,Unicode字符和轉義字符由于($* *+?|()+?|())被正則表達式用作元字符元字符,如作為普通字符使用則需要轉義正則表達式正則表達式字符串字符串說明說明foThe quick brown fox jumps for food匹配其中3個含有fo的字符串1+1=21+1=2+為元字符,無法匹配1+1=21+1=2“1+1=2”(note)please(note)()為元字符, 匹配”note”(note)ple

30、ase(note)匹配“(note)”80Python中的正則表達式引擎Python中,rere模塊提供了正則表達式操作所需要的功能:re.findall(pattern, string)re.findall(pattern, string):以列表形式列出字符串中模式的所有匹配項Python語句語句匹配結果匹配結果re.findall(fo,The quick brown fox jumps for food)fo, fo, fore.findall(1+1=2,1+1=2)re.findall(1+1=2,1+1=2)1+1=2re.findall(note),please(note)no

31、tere.findall(note),please(note)(note) import re #導入模塊re re.findallre.findall(d , godness) #re模塊還有其他方法,先介紹findalldd814.2.1 正則表達式元字符正則表達式元字符元字符分類:字符類預定義字符類邊界匹配符重復限定符分組符()()選擇符| |如:bb . . * * ()() 都是元字符元字符824.2.1 正則表達式元字符-字符類字符類字符類:由一對方括號括起來的字符集合,定義方式如下: xyzxyz : 枚舉字符集,匹配括號中任意字符pjcython可以匹配python、jytho

32、n、cythonxyzxyz : 否定枚舉字符集,匹配不在括號中任意字符abcabc 可以匹配一個任意除a、b、c之外的字符 a a- -z z : : 指定范圍的字符,匹配指定范圍的任意字符 a a- -zAzA- -Z0Z0- -9 9 可以匹配一個任意大小寫字母或數字m m- -z z : : 指定范圍以外的字符,匹配指定范圍以外的任意字符元字符元字符說明說明匹配位于中的任意一個一個字符-用在之內之內用來表示范圍用在之內之內用來表示否定834.2.1 正則表達式元字符-預定義字符類預定義字符類預定義字符類:正則表達式將常常用到的一些特定字符類形成了若干預定義字符類元字符元字符說明說明匹配

33、除換行符以外的任意單個字符匹配任何數字,相當于0-9D與d含義相反,非數字,相當于0-9s匹配任何空白字符,相當于tnrfvSS與s含義相反,相當于tnrfvww匹配任何字母、數字以及下劃線,相當于a-zA-Z0-9_WW與w含義相反,相當于a-zA-Z0-9_844.2.1 正則表達式元字符-邊界匹配符邊界匹配符邊界匹配符:字符串匹配往往涉及從某個位置開始匹配,例如行的開頭或結果、單詞邊界等,邊界匹配符用于匹配字符串的位置位置元字符元字符說明說明匹配行首,匹配以后面的字符開頭的字符串如:“ a”匹配“abc”中的“a”,不匹配“bat”中的“a”$匹配行尾,匹配以$之前的字符結束的字符串如:

34、“c$”匹配“abc”中的“c”,不匹配“acb”中的“c”b匹配單詞頭或單詞尾如:“bfoob”匹配“foo.” 、“(foo)” 、“bar foo baz”中的 “foo”,但不匹配“foobar”“foo3”注意注意:b在正則表達式表示單詞邊界,而在字符串中b表示退格字符,所以這些與標準轉義字符重復的元字符與標準轉義字符重復的元字符必須使用兩個字符,在python中也可以使用原始字符串r”或r,即“bfoob” 或 r“bfoob”B與b含義相反如:pyB 匹配 ”python” “py3” “py2”,但不匹配 “happy” “sleepy” “py!”+ 練習:請在練習:請在Py

35、thon中驗證表中的匹配結果中驗證表中的匹配結果854.2.1 正則表達式元字符-重復限定符重復限定符重復限定符:指定重復的次數正則表達式正則表達式 說明說明Xn,mX重復n到m次如:“o1,3”匹配“fooooood”中的前3個“o”和后3個“o”Xn,X至少重復n次如:“o2,”匹配“fooooood”中的所有的“o”,不匹配“bob”中的“o”XnX重復n次如:“b0-93”匹配 “000” “999”, “o2”匹配“food”中的兩個 “o”,不匹配“bob”中的“o”X+X重復1次或多次,等價于X 1,如:zo+ 匹配 “zo” ,“zoo”,但不匹配 “z”X*X重復0次或多次,

36、等價于X 0,如:zo* 匹配 “zo” ,“zoo”, “z”X?X重復0次或1次,等價于X0,1如:colou? ?r 匹配 “color” , “colour”+ 練習:請在練習:請在Python中驗證表中的匹配結果中驗證表中的匹配結果86匹配算法:貪婪性匹配算法Python針對重復限定符,默認采用貪婪性匹配算法貪婪性匹配算法貪婪性匹配算法貪婪性匹配算法是指重復限定符會導致正則表達式引擎盡可能多盡可能多地重復前導字符,只有當這種重復引起整個正則表達式匹配失敗的情況下,引擎會進行回溯 import re re.findallfindall(. , PythonDongbookPythonD

37、ong)PythonDongPythonDong貪婪算法返回了一個最左邊的最長匹配!貪婪算法返回了一個最左邊的最長匹配!如何如我們期望的那樣匹配如何如我們期望的那樣匹配XML的開始與結束標簽?的開始與結束標簽?87匹配算法:懶惰性匹配算法如果在限定符后面加后綴”? ?”,正則表達式引擎則使用懶惰性匹懶惰性匹配算法配算法懶惰性匹配算法懶惰性匹配算法是指重復限定符會導致正則表達式引擎盡可能少盡可能少地重復前導字符,只有當這種重復引起整個正則表達式匹配失敗的情況下,引擎會進行回溯符號符號說明說明*?重復任意次,但盡可能少重復+?重復1次或更多次,但盡可能少重復?重復0次或1次,但盡可能少重復n,m?

38、 重復n到m次,但盡可能少重復n,?重復n次以上,但盡可能少重復 import re re.findall.findall(. , PythonDongbookPythonDong) , book, , title, / , title, , author, / , author, / 88 telNumber = Suppose my Phone No. isyours is his is pattern = pile(r(r(d 3, 4 )-(d 7,8 )d 3, 4 )-(d 7,8 ) patter

39、n.findallfindall(telNumber)(0535, 1234567), (010, 12345678), (025, 87654321)(0535, 1234567), (010, 12345678), (025, 87654321) re.findallfindall(r(dr(d 3, 4 )-( 3, 4 )-(d d 7, 8 ) 7, 8 ), telNumber)(0535, 1234567), (010, 12345678), (025, 87654321)(0535, 1234567), (010, 12345678), (025, 87654321) re.f

40、indallfindall(r(dr(d 3, 4 )-( 3, 4 )-(d d 7, 8 ) 7, 8 ), telNumber) 0535, 1234567), 010, 12345678), (025- 0535, 1234567), 010, 12345678), 025, 87654321)87654321, 025, 87654321)4.2.1 正則表達式元字符-分組符分組符”()()”:重復限定符重復前導字符,如果需要重復的符合某種

41、模式的多個字符,則需要將描述該模式的正則表達式放在()()內,()()表示一個分組(子模式),子模式),即()()內的內容作為一個整體出現例如: ( (redred) )+ +可以匹配 redred、redredred等多個重復 red的情況re. findall(pattern,string,flags):返回匹配結果列表,若pattern含有子模式,同時返回子模式的列表正則表達式正則表達式說明說明(pattern)?允許模式重復0次或1次(pattern)*允許模式重復0次或多次(pattern)+允許模式重復1次或多次(pattern)m.n允許模式重復mn次894.2.1 正則表達式元

42、字符-分組符選擇符”| |”,用于選擇匹配多個可能的正則表達式中的一個選擇符”| |”的優(yōu)先級最低,如果需要使用()()來限制選擇符的作用范圍Python語句語句匹配結果匹配結果re.findall(red|green|blue, pink red ,green and blue)red, green, bluere.findall(b(red|green|blue)b, bluesky,pink red ,green and blue)red, green, blue import re re.findall(0d2(0d2| |d3)-(d8d3)-(d8| |d6d6), 復旦大學總機0

43、21-65642222) 021, 65642222) 021, 65642222)+ 例子:電話號碼一般形式為例子:電話號碼一般形式為“區(qū)號區(qū)號-電話號碼電話號碼”,區(qū)號為,區(qū)號為3位或位或4位,電話號位,電話號碼為碼為6位或位或8位數字。位數字。904.2.2 re模塊主要方法rere模塊模塊的主要方法匹配和搜索分割字符串匹配和替換既可以直接使用re模塊的方法進行字符串處理,也可以將模式編譯為正則表達式對象,然后使用正則表達式的方法來操作字符串914.2.2 re模塊主要方法rere模塊模塊的主要方法列表pattern:匹配模式 st

44、ring:要匹配的字符串 flag:匹配選項方法方法說明說明findall(pattern,string,flags)列出字符串中模式的所有匹配項返回匹配結果列表,若pattern含有組(子模式),同時返回組的列表search(pattern,string,flags)在字符串中尋找模式若匹配,返回Match對象(參見4.2.5),否則返回Nonematch(pattern,string,flags)從字符串的開始處匹配模式若匹配,返回Match對象,否則返回Nonesplit(pattern,string,maxsplit=0)根據模式匹配項(匹配分割符)分割字符串,返回分割后的字符串列表,

45、maxsplit為分割的最大次數sub(pat,repl,string,count=0)將字符串中所有pat的匹配項用repl替換;并返回替換后的字符串,count為替換的最大次數subn(pat,repl,string,count=0)將字符串中所有pat的匹配項用repl替換;并返回元組:(替換后的字符串,替換次數),count為替換的最大次數escape(string)將字符串中所有特殊正則表達式字符轉義924.2.2 re模塊主要方法flag:匹配選項(可以使用|進行組合)匹配選項匹配選項說明說明re.l re.IGNORECASE忽略大小寫re.L re.lOCALEw W b B

46、s S與本地字符集有關re.M re.MULTILINE多行匹配模式re.S re.DOTALL使元字符,也匹配換行符re.U re.UNICODE匹配Unicode字符re.X re.VERBOSE忽略模式中的空格,并可以使用#注釋,提高可讀性93示例:匹配搜索、分割+ 練習:請在練習:請在Python中驗證表中的匹配結果中驗證表中的匹配結果Python語句語句匹配結果匹配結果re.findall(pat,text) #查找所有單詞alpha, beta, gamma, deltare.match(done|quit,done) #匹配成功print(re.match(done|quit,d

47、oe!) ) #不成功Noneprint(re.match(to, To be,nor not to be)Nonere.search(to, To be,nor not to be)re.split(. +, text)alpha, beta, gamma, deltare.split(. +, text, maxsplit=2)alpha, beta, gamma deltare.split(. +, text, maxsplit=1) #分割1次alpha, beta.gamma delta import re text = alpha. beta.gamma deltaalpha. b

48、eta.gamma delta pat = a-zA-Z+a-zA-Z+944.2.3 直接使用re模塊方法 示例:替換,轉義 import re pat = namename text = Dear name. re.subsub(pat, Mr.Dong, text) #字符串替換Dear Mr.Dong.Dear Mr.Dong. s = a s d re.subsub(a|s|da|s|d , good, s) #字符串替換good good goodgood good good re.escapeescape() #字符串轉義http:/www

49、.954.2.3 直接使用re模塊方法 示例:刪除字符串中重復的空格 import re s=aaa bb c d e fff re.splitsplit(ss+, s)aaa, bb, c, d, e, fff, aaa, bb, c, d, e, fff, re.splitsplit(ss+, s.strip()aaa, bb, c, d, e, fffaaa, bb, c, d, e, fff .joinjoin(re.splitsplit(ss+, s.strip()aaa bb c d e fffaaa bb c d e f

50、ff re.subsub(ss+, , s.strip()aaa bb c d e fffaaa bb c d e fff saaa bb c d e fff aaa bb c d e fff s.splitsplit() #也可以不使用正則表達式aaa, bb, c, d, e, fffaaa, bb, c, d, e, fff .joinjoin(s.splitsplit()aaa bb c d e fffaaa bb c d e fff96 示例:使用以開頭的元字符 import re example = ShanDong Institute of Business and Techno

51、logy re.findallfindall(ba.+?bba.+?b , example) #以a開頭的完整單詞andand re.findallfindall(Bo.+?bBo.+?b , example) #不以o開頭且含有o字母的單詞剩余部分ong, ologyong, ology re.findallfindall(bw.+?bbw.+?b , example) #所有單詞ShanDong, Institute, of, Business, and, TechnologyShanDong, Institute, of, Business, and, Technology re.fin

52、dallfindall(rrbw.+?bw.+?bb, example) #使用原始字符串,減少輸入ShanDong, Institute, of, Business, and, TechnologyShanDong, Institute, of, Business, and, Technology re.findallfindall(d.d.dd.d.d , Python 2.7.8,Python 3.4.2) #查找并返回x.x.x的數字形式2.7.8, 3.4.2 2.7.8, 3.4.2 re.splitsplit(ss , example) #使用任何空白字符分割字符串ShanDon

53、g, Institute, of, Business, and, TechnologyShanDong, Institute, of, Business, and, Technology974.2.4 使用正則表達式對象使用re模塊的compile()方法將正則表達式編譯生成正則表達式對象,然后再使用正則表達式對象提供的方法進行字符串處理。regex=pile(pattern,flags) #編譯生成正則表達式使用編譯后的正則表達式對象可以提高字符串處理速度。方法方法說明說明regex.match(string, pos, endpos)在字符串開頭或指定位置進行搜索,模式必須出現在字符串開頭

54、或指定位置;若匹配,返回Match對象,否則返回Noneregex.search(string, pos, endpos)在整個字符串中進行搜索;若匹配,返回Match對象,否則返回Noneregex.findall(string, pos, endpos)在字符串中查找所有符合正則表達式的字符串列表;返回匹配結果列表,若pattern含有組,同時返回組的列表regex.sub(repl,string,count=0)將字符串中所有pattern的匹配項用repl替換;并返回替換后的字符串,count為替換的最大次數regex.subn(repl,string,count=0)將字符串中所有p

55、at的匹配項用repl替換,并返回元組:(替換后的字符串,替換次數),count為替換的最大次數regex.split(string, maxsplit = 0)根據模式匹配項(匹配分割符)分割字符串,返回分割后的字符串列表,maxsplit為分割的最大次數984.2.4 使用正則表達式對象 import re example = ShanDong Institute of Business and TechnologyShanDong Institute of Business and Technology pattern = pilecompile(rbBw+brbBw+b) #以B開頭的

56、單詞 pattern.findallfindall(example)BusinessBusiness pattern = pilecompile(rw+gbrw+gb) #以g結尾的單詞 pattern.findallfindall(example)ShanDongShanDong pattern = pilecompile(rba-zA-Z3brba-zA-Z3b) #查找3個字母長的單詞 pattern.findallfindall(example)andand pattern.matchmatch(example) #從字符串開頭開始匹配,所以不成功,沒有返回值 pattern.sear

57、chsearch(example) #在整個字符串中搜索,所以成功 pattern = pilecompile(rbwrbw* *awaw* *bb ) #查找所有含有字母a的單詞 pattern.findallfindall(example)ShanDong, andShanDong, and示例:匹配搜索99 example = Beautiful is better than ugly.Explicit is better than implicit.Simple is better than complex.Complex is better than complicated.Flat

58、 is better than nested.Sparse is better than dense.Readability counts. 示例:使用正則表達式對象替換Python語句語句運行結果運行結果1.將以字母“b”和”B”開頭的單詞替換為“*” pattern = pilecompile(rbbwrbbw* *bb, re.I) print(pattern.subsub( * * , example)* is * than ugly.Explicit is * than implicit.Simple is * than complex.Complex is * than compl

59、icated.Flat is * than nested.Sparse is * than dense.Readability counts.2.將第一個以字母“b”和”B”開頭的單詞替換為“*”(只替換一次) pattern = pilecompile(rbbwrbbw* *bb, re.I) print(pattern.subsub( * * , example, 1)* is better than ugly.Explicit is better than implicit.Simple is better than complex.Complex is better than comp

60、licated.Flat is better than nested.Sparse is better than dense.Readability counts.3.將第一個以字母“b”開頭的單詞替換為“*” pattern = pilecompile(rbbwrbbw* *bb) print(pattern.subsub( * * , example, 1)Beautiful is * than ugly.Explicit is better than implicit.Simple is better than complex.Complex is better than complic

溫馨提示

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

評論

0/150

提交評論