久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Python 正則表達(dá)式學(xué)習(xí)摘要及資料

 River_LaLaLa 2016-08-01


來源:Michael_翔_

鏈接:segmentfault.com/a/1190000006061975


摘要


  • 在正則表達(dá)式中,如果直接給出字符,,就是精確匹配,。

  • {m,n}? 對(duì)于前一個(gè)字符重復(fù) m 到 n 次,并且取盡可能少的情況 在字符串'aaaaaa'中,,a{2,4} 會(huì)匹配 4 個(gè) a,,但 a{2,4}? 只匹配 2 個(gè) a。


^表示行的開頭,,^\d表示必須以數(shù)字開頭,。


$表示行的結(jié)束,\d$表示必須以數(shù)字結(jié)束,。


你可能注意到了,,py也可以匹配'python'–>py;

但是加上^py$就變成了整行匹配,,就只能匹配’py’了,匹配'python'時(shí),就什么也得不到,。


參考表


正則表達(dá)式特殊序列



re模塊


re.compile(pattern[, flags])

把正則表達(dá)式的模式和標(biāo)識(shí)轉(zhuǎn)化成正則表達(dá)式對(duì)象,,供 match() 和 search() 這兩個(gè)函數(shù)使用。


re 所定義的 flag 包括:


re.I 忽略大小寫

re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依賴于當(dāng)前環(huán)境

re.M 多行模式

re.S 即為’ . ’并且包括換行符在內(nèi)的任意字符(’ . ’不包括換行符)

re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依賴于 Unicode 字符屬性數(shù)據(jù)庫(kù)

re.X 為了增加可讀性,,忽略空格和’ # ’后面的注釋


以下兩種用法結(jié)果相同:


(A)


compiled_pattern = re.compile(pattern)

result = compiled_pattern.match(string)


(B)


result = re.match(pattern, string)


s = 'ABC\\-001' # Python的字符串

#對(duì)應(yīng)的正則表達(dá)式字符串變成:

#'ABC\-001'


因此我們強(qiáng)烈建議使用Python的r前綴,,就不用考慮轉(zhuǎn)義的問題了


s = r'ABC\-001' # Python的字符串

# 對(duì)應(yīng)的正則表達(dá)式字符串不變:

# 'ABC\-001'


search


re.search(pattern, string[, flags])

在字符串中查找匹配正則表達(dá)式模式的位置,返回 MatchObject 的實(shí)例,,如果沒有找到匹配的位置,,則返回 None。

對(duì)于已編譯的正則表達(dá)式對(duì)象來說(re.RegexObject),,有以下 search 的方法:

search (string[, pos[, endpos]])

若 regex 是已編譯好的正則表達(dá)式對(duì)象,,regex.search(string, 0, 50) 等同于 regex.search(string[:50], 0)。


>>> pattern = re.compile('a')

>>> pattern.search('abcde')     # Match at index 0

>>> pattern.search('abcde', 1)  # No match;


match


re.match(pattern, string[, flags])


判斷 pattern 是否在字符串開頭位置匹配,。對(duì)于 RegexObject,,有:

match(string[, pos[, endpos]])


match() 函數(shù)只在字符串的開始位置嘗試匹配正則表達(dá)式,也就是只報(bào)告從位置 0 開始的匹配情況,,而 search() 函數(shù)是掃描整個(gè)字符串來查找匹配,。如果想要搜索整個(gè)字符串來尋找匹配,應(yīng)當(dāng)用 search(),。


>>> pattern.match('bca',2).group()

'a'


雖然,match默認(rèn)是從開頭匹配,,但是,,如果指定位置,仍然能成功,;但是,!match也是從指定位置開始匹配,不匹配仍然會(huì)失敗,,這一點(diǎn)就和search有區(qū)別啦,。


match()方法判斷是否匹配,如果匹配成功,,返回一個(gè)Match對(duì)象,,否則返回None。


test = '用戶輸入的字符串'

if re.match(r'正則表達(dá)式', test):

    print('ok')

else:

    print('failed')


split


re.split(pattern, string[, maxsplit=0, flags=0])

此功能很常用,,可以將將字符串匹配正則表達(dá)式的部分割開并返回一個(gè)列表,。對(duì) RegexObject,有函數(shù):

split(string[, maxsplit=0])


對(duì)于一個(gè)找不到匹配的字符串而言,,split 不會(huì)對(duì)其作出分割


>>> 'a b   c'.split(' ')

['a', 'b', '', '', 'c']


這里用字符串自帶的split方法就很不靈活,。


>>> re.split(r'\s+', 'a b   c')

['a', 'b', 'c']


看出差別了吧,,很強(qiáng)大!

再來一個(gè)終極的:


>>> re.split(r'[\s\,\;]+', 'a,b;; c  d')

['a', 'b', 'c', 'd']


r'[\s\,\;]+'的正則表達(dá)式意思為:空格或者,或者;出現(xiàn)1次或1次以上都是滿足條件的分割符號(hào),!所以,,最后結(jié)果還是很干凈。


findall


re.findall(pattern, string[, flags])


在字符串中找到正則表達(dá)式所匹配的所有子串,,并組成一個(gè)列表返回,。同樣 RegexObject 有:


findall(string[, pos[, endpos]])


#get all content enclosed with [], and return a list

>>> pattern=re.compile(r'hh')

>>> pattern.findall('hhmichaelhh')

['hh', 'hh']


finditer


re.finditer(pattern, string[, flags])


和 findall 類似,在字符串中找到正則表達(dá)式所匹配的所有子串,,并組成一個(gè)迭代器返回,。同樣 RegexObject 有:


finditer(string[, pos[, endpos]])


sub


re.sub(pattern, repl, string[, count, flags])


在字符串 string 中找到匹配正則表達(dá)式pattern 的所有子串,用另一個(gè)字符串 repl 進(jìn)行替換,。如果沒有找到匹配 pattern 的串,,則返回未被修改的 string。Repl 既可以是字符串也可以是一個(gè)函數(shù),。


返回值是替換后的新字符串,。


對(duì)于 RegexObject 有:


sub(repl, string[, count=0])


>>> pattern=re.compile(r'\d')

>>> pattern.sub('no','12hh34hh')

'nonohhnonohh'

>>> pattern.sub('no','12hh34hh',0)

'nonohhnonohh'

>>> pattern.sub('no','12hh34hh',count=0)

'nonohhnonohh'

>>> pattern.sub('no','12hh34hh',1)

'no2hh34hh'


通過上面的例子,可以看出,count是可以缺省的,,同時(shí),,默認(rèn)值是0,表示全部替換,;否則,,就是指定替換幾個(gè)。


subn


re.subn(pattern, repl, string[, count, flags])


該函數(shù)的功能和 sub() 相同,,但它還返回新的字符串以及替換的次數(shù),。同樣 RegexObject 有:

subn(repl, string[, count=0])


>>> pattern.subn('no','12hh34hh',count=0)

('nonohhnonohh', 4)


分組


除了簡(jiǎn)單地判斷是否匹配之外,正則表達(dá)式還有提取子串的強(qiáng)大功能,。用()表示的就是要提取的分組(Group),。比如:


^(\d{3})-(\d{3,8})$分別定義了兩個(gè)組,可以直接從匹配的字符串中提取出區(qū)號(hào)和本地號(hào)碼:


>>> m = re.match(r'^(\d{3})-(\d{3,8})$', '010-12345')

>>> m

_sre.SRE_Match object; span=(0, 9), match='010-12345'>

>>> m.group(0)

'010-12345'

>>> m.group(1)

'010'

>>> m.group(2)

'12345'

>>> m.groups()

('010', '12345')


通過實(shí)驗(yàn),,如果不用括號(hào),,得到的Match對(duì)象課可以使用例如a.group(0)或者a.group()但是,使用a.group(1)就會(huì)報(bào)錯(cuò)的,。


貪婪匹配


正則匹配默認(rèn)是貪婪匹配,,也就是匹配盡可能多的字符。舉例如下,,匹配出數(shù)字后面的0:


>>> re.match(r'^(\d+)(0*)$', '102300').groups()

('102300', '')


由于\d+采用貪婪匹配,,直接把后面的0全部匹配了,結(jié)果0*只能匹配空字符串了。


必須讓\d+采用非貪婪匹配(也就是盡可能少匹配),,才能把后面的0匹配出來,,加個(gè)?就可以讓d+采用非貪婪匹配:


>>> re.match(r'^(\d+?)(0*)$', '102300').groups()

('1023', '00')


Python正則表達(dá)式學(xué)習(xí)資源



    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多