python專題——正則表達(dá)式_第1頁
python專題——正則表達(dá)式_第2頁
python專題——正則表達(dá)式_第3頁
python專題——正則表達(dá)式_第4頁
python專題——正則表達(dá)式_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、正則表達(dá)式正則表達(dá)式(Regular Expression)是一種文本模式,包括普通字符和特殊字符。正則表達(dá)式使用單個字符串來描述、匹配一系列某個句法規(guī)則的字符串。簡介為什么使用正則表達(dá)式l 測試字符串內(nèi)的模式l 替換文本l 基于模式匹配從字符串中提取子字符串語法正則表達(dá)式(regular expression)描述了一種字符串匹配的模式(pattern),可以用來檢查一個串是否含有某些子串、將匹配的子串替換或者從某個串中取出符合某個條件的子串等。普通字符普通字符包括沒有顯示指定為元字符(特殊字符和符號)的所有可打印和不可打印字符,這包括所有大寫和小寫字母、所有數(shù)字、所有標(biāo)點(diǎn)符號和一些其他字符

2、。非打印字符特殊字符所謂特殊字符,就是一些含有特殊含義的字符。許多元字符要求在試圖匹配它們時特別對待。若要匹配這些特殊字符,必須首先使用字符“轉(zhuǎn)義”,即,將反斜杠“”放在它們前面。限定符限定符用來指定正則表達(dá)式的一個給定組件必須要出現(xiàn)多少次才能滿足匹配。l “*”匹配前面的子表達(dá)式零次或多次,例如/zo*/,匹配“*”前的字符“o”零次或多次,匹配“z”時匹配了“*”前的子表達(dá)式“o”是零次。l *、+和?限定符都是貪婪的,因?yàn)樗鼈儠M可能多的匹配文字,只有在它們的后面加上?就可以實(shí)現(xiàn)非貪婪或最小匹配。例如:<H1>Chapter 1 - 介紹正則表達(dá)式</H1>貪婪模

3、式:下面的表達(dá)式匹配從開始小于符號 (<) 到關(guān)閉 H1 標(biāo)記的大于符號 (>) 之間的所有內(nèi)容。/<.*>/ ,貪婪模式匹配結(jié)果:<H1>Chapter 1 - 介紹正則表達(dá)式</H1>非貪婪:如果您只需要匹配開始和介紹 H1 標(biāo)記,下面的非貪婪表達(dá)式只匹配 <H1>。/<.*?>/,非貪婪只會匹配:<H1>定位符定位符能夠?qū)⒄齽t表達(dá)式固定到行首或行尾。注意:l 不能講限定符與定位點(diǎn)一起使用。不允許諸如*之類的表達(dá)式。l 若要匹配一行文本開始處的文本,在正則表達(dá)式的開始使用字符。l 若要匹配一行文本的結(jié)束處的

4、文本,在正則表達(dá)式的結(jié)束處使用$字符。例如:/Chapter 1-90-90,1$/字邊界是單詞和空格之間的位置。非字邊界是任何其他位置。下面的表達(dá)式匹配單詞Chapter的開頭三個字符,因?yàn)檫@三個字符出現(xiàn)在字邊界的后面:/bCha/b字符的位置是非常重要的。如果它位于匹配字符串的開始,它在單詞開始處查找匹配項(xiàng)。如果位于字符串的結(jié)尾,他在單詞的結(jié)尾處查找匹配項(xiàng)。ter/b下面的表達(dá)式匹配Chapter中的字符串a(chǎn)pt,但不匹配aptitude中的字符串a(chǎn)pt:/Bapt/選擇用圓括號將所有選擇項(xiàng)括起來,相鄰的選擇項(xiàng)之間用|分隔。但圓括號會有一個副作用,是相關(guān)的匹配會被緩存,此時可用?:放在第一

5、個選項(xiàng)前來消除這種副作用。其中 ?: 是非捕獲元之一,還有兩個非捕獲元是 ?= 和 ?!,這兩個還有更多的含義,前者為正向預(yù)查,在任何開始匹配圓括號內(nèi)的正則表達(dá)式模式的位置來匹配搜索字符串,后者為負(fù)向預(yù)查,在任何開始不匹配該正則表達(dá)式模式的位置來匹配搜索字符串。反向引用對一個正則表達(dá)式模式或部分模式兩邊添加圓括號將導(dǎo)致相關(guān)匹配存儲到一個臨時緩沖區(qū)中,所捕獲的每個子匹配都按照在正則表達(dá)式模式中從左到右出現(xiàn)的順序存儲。緩沖區(qū)編號從 1 開始,最多可存儲 99 個捕獲的子表達(dá)式。每個緩沖區(qū)都可以使用 n訪問,其中 n 為一個標(biāo)識特定緩沖區(qū)的一位或兩位十進(jìn)制數(shù)。可以使用非捕獲元字符 

6、;?:、?= 或 ?! 來重寫捕獲,忽略對相關(guān)匹配的保存。例如:var str = "Is is the cost of of gasoline going up up"var patt1 = /b(a-z+) 1b/;document.write(str.match(patt1);捕獲的表達(dá)式,正如 a-z+ 指定的,包括一個或多個字母。正則表達(dá)式的第二部分是對以前捕獲的子匹配項(xiàng)的引用,即,單詞的第二個匹配項(xiàng)正好由括號表達(dá)式匹配。1 指定第一個子匹配項(xiàng)。字邊界元字符確保只檢測整個單詞。否則,諸如 "is issued" 或

7、 "this is" 之類的詞組將不能正確地被此表達(dá)式識別。正則表達(dá)式后面的全局標(biāo)記 g 指定將該表達(dá)式應(yīng)用到輸入字符串中能夠查找到的盡可能多的匹配。表達(dá)式的結(jié)尾處的不區(qū)分大小寫 i 標(biāo)記指定不區(qū)分大小寫。多行標(biāo)記指定換行符的兩邊可能出現(xiàn)潛在的匹配。組(?P<name>) ?P代表的是Python的語法擴(kuò)展,<name>代表自定義命名,.代表命名的語法規(guī)則。比如:(?P<num>d+),命名之后可以在后面調(diào)用。比如:re.findall(r'(?P<num>d+)a-z+(?P=num)',s) # 找出中間夾

8、有字母的數(shù)字。元字符運(yùn)算符優(yōu)先級匹配規(guī)則基本模式匹配模式是正則表達(dá)式最基本的元素,它們是一組描述字符串特征的字符。字符簇a-z /匹配所有的小寫字母 A-Z /匹配所有的大寫字母 a-zA-Z /匹配所有的字母 0-9 /匹配所有的數(shù)字 0-9.- /匹配所有的數(shù)字,句號和減號 frtn /匹配所有的白字符a-z /除了小寫字母以外的所有字符 / /除了()(/)()之外的所有字符 "' /除了雙引號(")和單引號(')之外的所有字符確定重復(fù)出現(xiàn)a-zA-Z0-9_1,$ / 所有包含一個以上的字母、數(shù)字或下劃線的字符串 1-90-90,$ / 所有的正整數(shù)

9、 -0,10-91,$ / 所有的整數(shù) -?0-9+.?0-9+$ / 所有的浮點(diǎn)數(shù)a-zA-Z0-9_+$ / 所有包含一個以上的字母、數(shù)字或下劃線的字符串 1-90-9*$ / 所有的正整數(shù) -?0-9+$ / 所有的整數(shù) -?0-9+.?0-9*$ / 所有的浮點(diǎn)數(shù)示例常用函數(shù)和方法Patternpile(strPattern, flag):這個方法是Pattern類的工廠方法,用于將字符串形式的正則表達(dá)式編譯為Pattern對象。 第二個參數(shù)flag是匹配模式,取值可以使用按位或運(yùn)算符'|'表示同時生效,比如re.I | re.M。另外,你也可以在regex字符串中指定

10、模式,比如pile('pattern', re.I | re.M)與pile('(?im)pattern')是等價的。 可選值有:· re.I(re.IGNORECASE): 忽略大小寫(括號內(nèi)是完整寫法,下同)· M(MULTILINE): 多行模式,改變''和'$'的行為(參見上圖)· S(DOTALL): 點(diǎn)任意匹配模式,改變'.'的行為· L(LOCALE): 使預(yù)定字符類 w W b B s S 取決于當(dāng)前區(qū)域設(shè)定· U(UNICODE): 使預(yù)

11、定字符類 w W b B s S d D 取決于unicode定義的字符屬性· X(VERBOSE): 詳細(xì)模式。這個模式下正則表達(dá)式可以是多行,忽略空白字符,并可以加入注釋。以下兩個正則表達(dá)式是等價的:a = pile(r"""d +  # the integral part                   .  

12、0; # the decimal point                   d *  # some fractional digits""", re.X)>>> m = a.match('3.45')>>> m.group()'3.45'>>> Pattern對象是一個編譯好的

13、正則表達(dá)式,通過Pattern提供的一系列方法可以對文本進(jìn)行匹配查找。Pattern不能直接實(shí)例化,必須使用pile()進(jìn)行構(gòu)造。Pattern提供了幾個可讀屬性用于獲取表達(dá)式的相關(guān)信息:1.pattern: 編譯時用的表達(dá)式字符串。2.flags: 編譯時用的匹配模式。數(shù)字形式。3.groups: 表達(dá)式中分組的數(shù)量。4.groupindex: 以表達(dá)式中有別名的組的別名為鍵、以該組對應(yīng)的編號為值的字典,沒有別名的組不包含在內(nèi)。import rep = pile(r'(w+) (w+)(?P<sign>.*)', re.DOTALL) 

14、;print "p.pattern:", p.patternprint "p.flags:", p.flagsprint "p.groups:", p.groupsprint "p.groupindex:", p.groupindex# output # p.pattern: (w+) (w+)(?P<sign>.*)# p.flags: 16# p.groups: 3# p.groupindex: 'sign': 3re模塊實(shí)例方法1. matc

15、h(string, pos, endpos) | re.match(pattern, string, flags): 這個方法將從string的pos下標(biāo)處起嘗試匹配pattern;如果pattern結(jié)束時仍可匹配,則返回一個Match對象;如果匹配過程中pattern無法匹配,或者匹配未結(jié)束就已到達(dá)endpos,則返回None。pos和endpos的默認(rèn)值分別為0和len(string);re.match()無法指定這兩個參數(shù),參數(shù)flags用于編譯pattern時指定匹配模式。 注意:這個方法并不是完全匹配。當(dāng)pattern結(jié)束時若string還有剩余字符,仍然視為成功

16、。想要完全匹配,可以在表達(dá)式末尾加上邊界匹配符'$'。2. search(string, pos, endpos) | re.search(pattern, string, flags): 這個方法用于查找字符串中可以匹配成功的子串。從string的pos下標(biāo)處起嘗試匹配pattern,如果pattern結(jié)束時仍可匹配,則返回一個Match對象;若無法匹配,則將pos加1后重新嘗試匹配;直到pos=endpos時仍無法匹配則返回None。 pos和endpos的默認(rèn)值分別為0和len(string);re.search()無法指定這兩個參數(shù),參數(shù)flags用

17、于編譯pattern時指定匹配模式。re.match與re.search的區(qū)別re.match只匹配字符串的開始,如果字符串開始不符合正則表達(dá)式,則匹配失敗,函數(shù)返回None;而re.search匹配整個字符串,直到找到一個匹配。3. split(string, maxsplit) | re.split(pattern, string, maxsplit): 按照能夠匹配的子串將string分割后返回列表。maxsplit用于指定最大分割次數(shù),不指定將全部分割。 4. findall(string, pos, endpos) | re.findall(pattern, st

18、ring, flags): 搜索string,以列表形式返回全部能匹配的子串。 正則表達(dá)式僅有一個子組時,findall()返回子組匹配的字符串組成的列表;如果表達(dá)式有多個子組,返回的結(jié)果是一個元組的列表,元組中每個元素都是一個子組的匹配內(nèi)容,像這樣的元組(每一個成功匹配對應(yīng)一個元組)構(gòu)成了返回列表中的元素。5. finditer(string, pos, endpos) | re.finditer(pattern, string, flags): 搜索string,返回一個順序訪問每一個匹配結(jié)果(Match對象)的迭代器。 import re p = pile(r'd+')for m in p.finditer('one1two2three3four4'):    print m.group(), # output # 1 2 3 46.sub(repl, string, count) | re.sub(pattern, repl, string, count): 使用repl替換string中每一個匹配的子串

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論