版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
第10章正則表達式2目錄10.1正則表達式簡介10.2簡單模式10.3使用正則表達式10.4更多模式功能10.5修改字符串10.6常見問題10.1正則表達式簡介正則表達式(RegularExpressions),通常被簡稱為REs或regexes,是一些由字符和特殊符號組成的字符串,它們描述了這些字符和字符的某種重復(fù)方式,因此能按某種模式匹配一個有相似特征的字符串的集合,也能按某模式匹配一系列有相似特征的字符串。正則表達式提供了一種緊湊的表示法,可用于表示字符串的組合,其之所以功能如此強大,是因為一個單獨的正則表達式可以表示無限數(shù)量的字符串,只要字符串滿足正則表達式的需求即可。正則表達式為高級文本模式匹配,以及文本的搜索與替代等功能提供了基礎(chǔ)。34目錄10.1正則表達式簡介10.2簡單模式10.3使用正則表達式10.4更多模式功能10.5修改字符串10.6常見問題10.2.1字符匹配510.2簡單模式絕大多數(shù)字符會與自身匹配。例如,正則表達式test會和字符串“test”完全匹配。這個規(guī)則也會有例外,有種字符比較特殊,我們把它們稱作元字符(Metacharacters),它們和自身并不匹配,而是會和一些特殊的東西匹配,或者通過某種方式影響到正則表達式的其他部分。元字符的完整列表如下:.^$*+?{}[]\|()10.2.1字符匹配610.2簡單模式元字符“[”與“]”用于指定一個字符類,所謂字符類就是你想匹配的一個字符集。字符可以單個列出,也可以用以“-”號分隔的兩個給定字符來表示一個字符區(qū)間。舉個簡單的例子,[abc]將匹配“a”“b”或“c”中的任意一個字符,使用區(qū)間[a-c]來可以達到與前者一樣的目的。只匹配小寫字母,那么正則表達式應(yīng)寫成[a-z]元字符在字符類里并不起作用。例如,[abc$]將匹配字符。“a”“b”“c”或“$”中的任意一個,雖然“$”通常用作元字符,但在字符類里,其特性被除去,恢復(fù)成普通字符。可以用補集來匹配不在區(qū)間范圍內(nèi)的字符。其做法是把“^”作為字符類的首個字符,其他地方的“^”字符只會簡單匹配“^”字符本身。例如,[^5]將匹配除了“5”之外的任意字符,而[5^]只會匹配字符“5”和“^”。10.2簡單模式10.2.1字符匹配另一個重要的元字符是反斜杠“\”?!癨”為Python中的字符串轉(zhuǎn)義字符,可以通過在反斜杠后面加不同的字符以表示不同特殊意義。它也可以用于取消所有的元字符,這樣就能夠在模式中匹配它們。例如,如果我們需要匹配字符“[”或“\”,可以在它們之前用反斜杠來取消它們的特殊意義:“\[”或“\\”。一些用“\”開始的特殊字符表示預(yù)定義的字符集,例如數(shù)字集、字母集或其他非空字符集等。10.2簡單模式Python的預(yù)定義字符集如下:預(yù)設(shè)特殊字符說
明\d匹配任何十進制數(shù),它相當(dāng)于類[0-9]\D匹配任何非數(shù)字字符,它相當(dāng)于類[^0-9]\s匹配任何空白字符,它相當(dāng)于類[\t\n\r\f\v]\S匹配任何非空白字符,它相當(dāng)于類[^\t\n\r\f\v]\w匹配任何字母數(shù)字字符,它相當(dāng)于類[a-zA-Z0-9_]\W匹配任何非字母數(shù)字字符,它相當(dāng)于類[^a-zA-Z0-9_]10.2簡單模式10.2.2重復(fù)正則表達式的另一個功能是可以指定正則表達式的某一部分的重復(fù)次數(shù)。我們討論的第一個具有重復(fù)功能的元字符是“*”。“*”并不匹配字符“*”,它表示前一個字符可以被匹配任意次數(shù),包括零次。例如,“ca*t”將匹配“ct”(0個“a”字符),“cat”(1個“a”字符),“caaat”(3個“a”字符)等。10.2簡單模式10.2.2重復(fù)像“*”這樣的重復(fù)我們稱作是貪婪的(Greedy)。當(dāng)重復(fù)一個正則表達式時,匹配引擎會試圖重復(fù)盡可能多的次數(shù)。如果模式的后面部分沒有被匹配,匹配引擎將退回并再次嘗試更小的重復(fù)。例如,模式“a[bcd]*b”。它首先匹配字母“a”,然后零個或更多個來自字符類[bcd]中的字母,最后以“b”結(jié)尾?,F(xiàn)在考慮該正則表達式對字符串“abcbd”的匹配。匹配過程如下表所示:10.2簡單模式步
驟匹配字符注
解1a匹配正則表達式中的“a”2abcbd引擎盡可能多地匹配[bcd]中的字符,這里匹配到字符串的結(jié)尾3失敗引擎嘗試匹配“b”,但當(dāng)前位置已經(jīng)是字符的最后了,所以失敗4abcb退回,[bcd]*嘗試少匹配一個字符5失敗再次嘗次匹配b,但在當(dāng)前最后一位字符是“d”6abc再次退回,[bcd]*只匹配“bc”7abcb再次嘗試匹配“b”,當(dāng)前位置上的字符正好是“b”,匹配成功10.2簡單模式10.2.2重復(fù)另一個重復(fù)元字符是+,表示匹配一次或更多次,注意+要求所匹配的字符至少出現(xiàn)一次。“ca+t”就可以匹配“cat”(1個“a”),“caaat”(3個“a”),但“ct”不能匹配。還有一些表示重復(fù)的元定符。問號?表示匹配一次或零次,我們可以將它用于標(biāo)識某字符是可選的。例如:“high-?tech”匹配“high-tech”或“hightech”。最復(fù)雜的重復(fù)限定符是{m,n},其中m和n是十進制整數(shù)。{m,n}表示某個匹配項至少需要重復(fù)m次,但不能超過n次。例如,a/{1,2}b可以匹配a/b和a//b,但不能匹配ab與a///b??梢允÷詍和n中的任意一個,省略m表示重復(fù)下限為0,而省略n則表示重復(fù)上限為無窮。目錄10.1正則表達式簡介10.2簡單模式10.3使用正則表達式10.4更多模式功能10.5修改字符串10.6常見問題10.3使用正則表達式10.3.1編譯正則表達式Python中通過re模塊提供了一個正則表達式引擎的接口,利用這個接口,我們可以將正則表達式編譯成對象并用它們來進行匹配。正則表達式被編譯成正則表達式對象(RegularExpressionObjects),可以為不同的操作提供方法,如模式匹配搜索或字符串替換。使用如下代碼編譯正則表達式對象:
>>>importre>>>p=pile('ab*')>>>ppile('ab*')10.3使用正則表達式10.3.2反斜杠帶來的問題則表達式用反斜杠字符“\”來表示特殊格式或在不觸發(fā)其特殊方法的情況下使用特殊字符。這就與Python在字符串中起相同作用的反斜杠字符產(chǎn)生了沖突。例如,為了匹配字符串“\section”,正則表達式需要在所有反斜杠字符和其他元字符前添加反斜杠來取消其特殊意義,即要匹配的字符串在程序中應(yīng)該寫成“\\section”。當(dāng)把這個字符串作為參數(shù)傳傳遞給pile()時必須還是“\\section”。作為Python的字符串值,“\\section”中的兩個反斜杠還要再次使用反斜杠取消特殊意義,最后結(jié)果就變成了“\\\\section”。也就是說,為了匹配一個反斜杠,必須在正則表達式字符串中寫四個反斜杠,導(dǎo)致輸入大量重復(fù)的反斜杠,而且所生成的字符串也很難理解。10.3使用正則表達式10.3.2反斜杠帶來的問題解決的辦法就是為正則表達式使用Python的原始(raw)字符串表示,在字符串前加上字符“r”,反斜杠就不會被任何特殊方式處理,所以r"\n"就包含“\”和“n”的兩個字符,而“\n”則表示一個字符,即換行。正則表達式在Python代碼中通常都是用這種原始字符串表示。如果想要匹配字符串“\section”,其原始字符串的表示法應(yīng)為:r"\\section"。10.3使用正則表達式10.3.3執(zhí)行匹配下表給出了正則表達式對象幾個最常用的方法:方
法目
的match()判斷從字符串開頭是否匹配正則表達式search()搜索整個字符串,找到正則表達式匹配的位置findall()找到所有匹配正則表達式的子串,并將它們作為一個列表返回finditer()找到所有匹配正則表達式的子串,并將它們作為一個迭代器返回10.3使用正則表達式10.3.3執(zhí)行匹配如果匹配失敗,match()和search()將返回None。如果匹配成功,就會返回一個match對象的實例,其中有此次匹配的信息:比如,匹配是從哪里開始在哪里結(jié)束,所匹配的子串等。match對象中重要的方法如下表所示:方
法目
的group()返回匹配正則表達式的字符串start()返回匹配字符串開始的位置end()返回匹配字符串結(jié)束的位置span()返回一個包含開始和結(jié)束位置的元組2023/5/1710.3使用正則表達式10.3.4模塊級函數(shù)re模塊提供了頂級函數(shù)調(diào)用,例如match()、search()、sub()等。沒有必要先創(chuàng)建一個正則表達式對象,再調(diào)用它的方法。這些函數(shù)使用正則表達式字符串作為第一個參數(shù),而后面的參數(shù)則與相應(yīng)正則表達式對象的方法參數(shù)相同,返回則要么是None,要么是一個match對象的實例。2023/5/1710.3使用正則表達式10.3.5編譯標(biāo)志使用編譯標(biāo)志可以修改正則表達式的一些運行方式。在re模塊中編譯標(biāo)志可以使用兩種形式表示,一是如同IGNORECASE的全名,另一種是一個字母的縮寫形式,例如IGNORECASE縮寫為I。多個標(biāo)志可以通過使用或符號“|”來分隔,如“re.I|re.M”表示同時設(shè)置I和M標(biāo)志,該標(biāo)志在編譯正則表達式對象時,以參數(shù)的形式輸入。2023/5/1710.3使用正則表達式10.3.5編譯標(biāo)志標(biāo)
志含
義ASCII,A使\w,\b等只匹配ASCII字符DOTALL,S使字符“.”匹配任意字符,包括換行符IGNORECASE,I使匹配對大小寫不敏感LOCALE,L做本地化識別(locale-aware)匹配MULTILINE,M多行匹配,會影響VERBOSE,X能夠使用正則表達式的verbose狀態(tài),使之更加清晰易懂Python正則表達式的編譯標(biāo)志由下表所示:2023/5/17目錄210.1正則表達式簡介10.2簡單模式10.3使用正則表達式10.4更多模式功能10.5修改字符串10.6常見問題2023/5/1710.4更多模式功能10.4.1其他元字符零寬界定符(Zero-WidthAssertions),包括\b和\B。\b表示單詞邊界。這是個零寬界定符,用以匹配單詞的開頭和結(jié)尾。之所以被稱為零寬界定符,是因為它們?nèi)缱置嬉馑家粯記]有“寬度”,在正則表達式中,通常一個字符應(yīng)對應(yīng)匹配文本中的一個或數(shù)個字符,但零寬界定符不匹配任何字符。例如只匹配“class”整個單詞;而當(dāng)它被包含在其他單詞中時不匹配,正則表達式可以寫成:r"\bclass\b"在Python字符串里,“\b”是回退符,使用原始字符串避免沖突?!癨B”作用正好同“\b”相反,只在當(dāng)前位置不是單詞邊界時才匹配。2023/5/1710.4更多模式功能10.4.1其他元字符“|”為“或”操作符,如果A和B均為正則表達式,那么A|B將匹配任何匹配了A或B的字符串?!癑ump|Run”將匹配字符串“Jump”或“Run”?!癪”用于匹配行首,除非設(shè)置了MULTILINE標(biāo)志,否則只匹配字符串開頭的部分。設(shè)置了MULTILINE標(biāo)志后,^可以匹配每一行的開頭。如果需要匹配在一行開頭的“From”字符串,正則表達式可以寫成“^From”?!?”與“^”正好相反,用于匹配行尾的字符串,行尾表示是一個字符串的結(jié)尾,或者任何后面緊跟著一個換行符的位置。2023/5/1710.4更多模式功能10.4.2分組正則表達式也常用來分析字符串,我們可以編寫一個正則表達式,匹配字符串中感興趣的部分,并將其分成幾個組(Group)。分組是通過括號“(”和“)”元字符來標(biāo)識的。位于它們之中的表達式組成一組例如,我們可以用重復(fù)限制符,例如*、+、?以及{m,n}來重復(fù)組里的內(nèi)容。比如(ab)*將匹配零或多個重復(fù)的“ab”:
>>>p=pile('(ab)*')>>>print(p.match('ababababab').span())(0,10)
分組總是從0開始計數(shù)的,而且第0組總是存在的,它就是不顯式地使用分組時正則表達式所匹配的字符串,上述match對象的方法都把第0組作為它們的缺省參數(shù)。2023/5/1710.4更多模式功能10.4.2分組通過分組方法獲得的小組(Subgroups)是從1開始從左向右計數(shù)的。組可以被嵌套,計數(shù)的值可以通過從左向右計算括號“(”的數(shù)目來確定,第0組即group(0)是一個特殊的組,它是不采取分組時,正則表達式所匹配的字符串2023/5/1710.4更多模式功能10.4.2分組一個匹配模式中的逆向引用(Backreferences)允許我們指定一個先前分組所獲得的內(nèi)容,并且該內(nèi)容在當(dāng)前位置也能找到。用法為反斜杠后緊跟一個分組號。例如,我們有一個逆向引用“\1”,用于指定分組1,假設(shè)分組1的內(nèi)容為一個單詞“book”,如果在逆向應(yīng)用出現(xiàn)的位置正好也是單詞“book”,那這個匹配就會成功,否則失敗。例如,下面的正則表達式會找出在字符串中被連續(xù)輸入了兩次的單詞:
>>>p=pile(r'(\b\w+)\s+\1')>>>p.search('Findthethebook').group()'thethe'2023/5/1710.4更多模式功能10.4.3無捕獲組和命名組正則表達式會使用很多組,既可以捕獲我們感興趣的子串,又可以分組和結(jié)構(gòu)化表達式本身。在復(fù)雜的正則表達式中,追蹤組號將變得困難。“無捕獲組”與“命名組”這兩個功能可以對這個問題有所幫助。它們也都使用正則表達式擴展的通用語法。緊跟在問號后面的字符說明了擴展的內(nèi)容,例如“(?=foo)”表示一個肯定前向界定符,而“?:foo”則是要討論的無捕獲組。2023/5/1710.4更多模式功能10.4.3無捕獲組和命名組當(dāng)我們想用一個組代表正則表達式的一部分,但又對獲取組中的內(nèi)容不感興趣時可以使用一個無捕獲組(Non-capturinggroup)——“(?:…)”來實現(xiàn)這項功能,括號中的“…”被替換成需要的正則表達式:
>>>m=re.match("([abc])+","abc")>>>m.groups()('c',)>>>m=re.match("(?:[abc])+","abc")>>>m.groups()()
當(dāng)不使用無捕獲組時,m的groups()方法返回分組1,其內(nèi)容為字符“c”,而當(dāng)使用無捕獲組后,返回分組中將不會有任何內(nèi)容。2023/5/1710.4更多模式功能10.4.3無捕獲組和命名組另一個擴展功能是命名組(NamedGroups),與通常使用數(shù)字引用分組不同的是,它可以用一個名字來引用分組。命名組表示為:(?P<name>…),尖括號中的文本即為組的名字,命名組的行為與捕獲組是相同的。當(dāng)對命名組使用match對象的方法時,既可以用表示組號的整數(shù)作為參數(shù),也可以用包含組名的字符串作為參數(shù),所以我們可以通過兩種方式來得到一個分組中的信息。2023/5/1710.4更多模式功能10.4.3無捕獲組和命名組使用命名可以是我們用容易記住的名字而不是難以記住數(shù)字來引用分組例如:
InternalDate=pile(r'INTERNALDATE"' r'(?P<day>[123][0-9])-(?P<mon>[A-Z][a-z][a-z])-' r'(?P<year>[0-9][0-9][0-9][0-9])'r'(?P<hour>[0-9][0-9]):( ?P<min>[0-9][0-9]):(?P<sec>[0-9][0-9])'r'(?P<zonen>[-+])( ?P<zoneh>[0-9][0-9])(?P<zonem>[0-9][0-9])'r'"')
使用分組名zonem來獲取分組內(nèi)容要比記住編號9來獲取分組容易得多。在逆向引用的語法中,也可以使用組名代替組號。引用組名的格式為:(?P=name),表示在當(dāng)前位置,名稱為name的組的內(nèi)容再次重現(xiàn)。2023/5/1710.4更多模式功能10.4.4前向界定符另外一個零寬界定符是前向界定符,或稱為前向斷言(LookaheadAssertions)。前向界定符有兩種形式—肯定(Positive)前向界定符和否定(Negative)前向界定符。(?=pattern)是一個肯定前向界定符,而(?!pattern)是一個否定前向界定符。其中的“pattern”是一個正則表達式,代表某個匹配模式。與通常的匹配模式不同的是,它只返回匹配的結(jié)果—成功或不成功,而不會引起正則表達式引擎的向前移動。換句話說,前向界定符不會“消耗”字符,而只是判斷該位置是否匹配??隙ㄇ跋蚪缍ǚ诋?dāng)前位置能夠匹配返回匹配成功,否則失敗。2023/5/1710.4更多模式功能10.4.4前向界定符例如,如果對“aregularexpression”這個字符串,我們只想匹配“regular”中的“re”,而不想匹配“expression”中的“re”,那么可以這樣寫正則表達式:re(?=gular)。這表示,當(dāng)“re”之后緊跟的字符串是“gular”才能匹配。2023/5/17目錄210.1正則表達式簡介10.2簡單模式10.3使用正則表達式10.4更多模式功能10.5修改字符串10.6常見問題2023/5/1710.5修改字符串除了簡單地搜索了一個靜態(tài)字符串外,正則表達式對象也含有一些方法用于修改字符串。如下表所示方
法目
的split()字符串分片,返回一個列表(List),分隔的位置為表達式匹配的地方sub()替換所有正則表達式匹配的子串subn()與sub()功能相同,但會返回新的字符串和替換字串的數(shù)量2023/5/1710.5修改字符串10.5.1字符串分片正則表達式對象的split()方法在正則表達式匹配的地方將字符串分片,并返回一個包含分片列表。它同字符串的split()方法相似,但通過正則表達式可以提供更多的分隔符。而字符串的split()方法只支持空白符和固定字符串。Python同樣也有一個模塊級的re.split()函數(shù)。split()方法的原型如下。
split(string[,maxsplit=0])可以通過設(shè)置maxsplit的值來限制分片數(shù),當(dāng)maxsplit非零時,最多只能有maxsplit+1個分片,字符串的其余部分被作為列表的最后一個元素返回。2023/5/1710.5修改字符串10.5.2搜索與替換下面是一個使用sub()方法的簡單例子,使用單詞“color”來替換具體的顏色名:>>>p=pile('(blue|white|red)')>>>p.sub('color','bluesocksandredshoes')'colorsocksandcolorshoes'>>>p.sub('color','bluesocksandredshoes',count=1)'colorsocksandredshoes'
subn()方法作用一樣,但返回的是一個包含新字符串和替換執(zhí)行次數(shù)的元組。
>>>p=pile('(blue|white|red)')>>>p.subn('color','bluesocksandredshoes')('colorsocksandcolorshoes',2)>>>p.subn('color','nocolorsatall')('nocolorsatall',0)2023/5/1710.5修改字符串10.5.2搜索與替換如果替換值是一個字符串,那么任何在其中的反斜杠都會被處理。比如“\n”將會被轉(zhuǎn)換成一個換行符,“\r”轉(zhuǎn)換成回車等等。未知的轉(zhuǎn)義字符如“\j”則保持原樣。逆向引用,如“\2”,被正則表達式中相應(yīng)的組所匹配的子串替換,這樣可以在替換后的字符串中插入原始文本的一部分。下面的例子匹配單詞“section”和緊跟該單詞、用括號“
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年及未來5年市場數(shù)據(jù)中國消費品檢測行業(yè)市場深度分析及發(fā)展趨勢預(yù)測報告
- 2026湖北武漢大方學(xué)校、武漢大方高中招聘參考題庫附答案
- 2026湖南醫(yī)發(fā)投養(yǎng)老產(chǎn)業(yè)有限公司子公司高級管理人員招聘2人考試備考題庫附答案
- 2026福建南平市建甌市人民法院招聘3人考試備考題庫附答案
- 2026福建漳州古雷港經(jīng)濟開發(fā)區(qū)第一醫(yī)院消控室招聘1人備考題庫附答案
- 2026第一季度重慶中醫(yī)藥學(xué)院附屬江津醫(yī)院(重慶市江津區(qū)中醫(yī)院)招聘9人參考題庫附答案
- 2026貴州京學(xué)貴陽附屬實驗學(xué)校招聘19人參考題庫附答案
- 2026重慶秀山土家族苗族自治縣公益崗招聘2人參考題庫附答案
- 2026黑龍江省社會主義學(xué)院招聘專職教師2人備考題庫附答案
- 四川省衛(wèi)健委所屬事業(yè)單位西南醫(yī)科大學(xué)附屬口腔醫(yī)院2025年12月公開考核招聘工作人員的考試備考題庫附答案
- 郵政服務(wù)操作流程與規(guī)范(標(biāo)準(zhǔn)版)
- 2026昆山鈔票紙業(yè)有限公司校園招聘15人備考題庫及1套完整答案詳解
- 2026年重慶市江津區(qū)社區(qū)專職人員招聘(642人)考試參考題庫及答案解析
- 2026年1月福建廈門市集美區(qū)后溪鎮(zhèn)衛(wèi)生院補充編外人員招聘16人筆試模擬試題及答案解析
- 單純皰疹病毒感染教學(xué)演示課件
- 廣東省中山市2023-2024學(xué)年四年級上學(xué)期期末數(shù)學(xué)試卷
- 變配電室送電施工方案
- 地質(zhì)勘查現(xiàn)場安全風(fēng)險管控清單
- 松下panasonic-經(jīng)銷商傳感器培訓(xùn)
- 中醫(yī)舌、脈象的辨識與臨床應(yīng)用課件
- 建設(shè)工程項目施工風(fēng)險管理課件
評論
0/150
提交評論