Python入門篇之正則表達(dá)式
正則表達(dá)式有兩種基本的操作,分別是匹配和替換。
匹配就是在一個(gè)文本字符串中搜索匹配一特殊表達(dá)式;
替換就是在一個(gè)字符串中查找并替換匹配一特殊表達(dá)式的字符串。
1.基本元素
正則表達(dá)式定義了一系列的特殊字符元素以執(zhí)行匹配動(dòng)作。
正則表達(dá)式基本字符
字符 | 描述 |
---|---|
text | 匹配text字符串 |
. | 匹配除換行符之外的任意一個(gè)單個(gè)字符 |
^ | 匹配一個(gè)字符串的開頭 |
$ | 匹配一個(gè)字符串的末尾 |
在正則表達(dá)式中,我們還可用匹配限定符來(lái)約束匹配的次數(shù)。
匹配限定符
最大匹配 | 最小匹配 | 描述 |
---|---|---|
* | * | 重復(fù)匹配前表達(dá)式零次或多次 |
+ | + | 重復(fù)匹配前表達(dá)式一次或多次 |
重復(fù)匹配前表達(dá)式零次或一次 | ||
{m} | {m} | 精確重復(fù)匹配前表達(dá)式m次 |
{m,} | {m,} | 至少重復(fù)匹配前表達(dá)式m次 |
{m,n} | {m,n} | 至少重復(fù)匹配前表達(dá)式m次,至多重復(fù)匹配前表達(dá)式n次 |
據(jù)上所述,".*"為最大匹配,能匹配源字符串所有能匹配的字符串。".* "為最小匹配,只匹配第一次出現(xiàn)的字符串。如:d.*g能匹配任意以d開頭,以g結(jié)尾的字符串,如"debug"和"debugging",甚至"dog is walking"。而d.* g只能匹配"debug",在"dog is walking"字符串中,則只匹配到"dog "。
在一些更復(fù)雜的匹配中,我們可用到組和運(yùn)算符。
組和運(yùn)算符
組 | 描述 |
---|---|
[...] | 匹配集合內(nèi)的字符,如[a-z],[1-9]或[,./;'] |
[^...] | 匹配除集合外的所有字符,相當(dāng)于取反操作 |
A|B | 匹配表達(dá)式A或B,相當(dāng)于OR操作 |
(...) | 表達(dá)式分組,每對(duì)括號(hào)為一組,如([a-b]+)([A-Z]+)([1-9]+) |
\number | 匹配在number表達(dá)式組內(nèi)的文本 |
有一組特殊的字符序列,用來(lái)匹配具體的字符類型或字符環(huán)境。如\b匹配字符邊界,food\b匹配"food"、"zoofood",而和"foodies"不匹配。
特殊字符序列
字符 | 描述 |
---|---|
\A | 只匹配字符串的開始 |
\b | 匹配一個(gè)單詞邊界 |
\B | 匹配一個(gè)單詞的非邊界 |
\d | 匹配任意十進(jìn)制數(shù)字字符,等價(jià)于r'[0-9]' |
\D | 匹配任意非十進(jìn)制數(shù)字字符,等價(jià)于r'[^0-9]' |
\s | 匹配任意空格字符(空格符、tab制表符、換行符、回車、換頁(yè)符、垂直線符號(hào)) |
\S | 匹配任意非空格字符 |
\w | 匹配任意字母數(shù)字字符 |
\W | 匹配任意非字母數(shù)字字符 |
\Z | 僅匹配字符串的尾部 |
\\ | 匹配反斜線字符 |
有一套聲明(assertion)對(duì)具體事件進(jìn)行聲明。
正則表達(dá)式聲明
聲明 | 描述 |
---|---|
( iLmsux) | 匹配空字符串,iLmsux字符對(duì)應(yīng)下表的正則表達(dá)式修飾符。 |
( :...) | 匹配圓括號(hào)內(nèi)定義的表達(dá)式,但不填充字符組表。 |
( P<name>) | 匹配圓括號(hào)內(nèi)定義的表達(dá)式,但匹配的表達(dá)式還可用作name標(biāo)識(shí)的符號(hào)組。 |
( P=name) | 匹配所有與前面命名的字符組相匹配的文本。 |
( #...) | 引入注釋,忽略圓括號(hào)內(nèi)的內(nèi)容。 |
( =...) | 如果所提供的文本與下一個(gè)正則表達(dá)式元素匹配,這之間沒(méi)有多余的文本就匹配。這允許在一個(gè)表達(dá)式中進(jìn)行超前操作,而不影響正則表達(dá)式其余部分的分析。如"Martin"其后緊跟"Brown",則"Martin( =Brown)"就只與"Martin"匹配。 |
( !...) | 僅當(dāng)指定表達(dá)式與下一個(gè)正則表達(dá)式元素不匹配時(shí)匹配,是( =...)的反操作。 |
( <=...) | 如果字符串當(dāng)前位置的前綴字符串是給定文本,就匹配,整個(gè)表達(dá)式就在當(dāng)前位置終止。如( <=abc)def表達(dá)式與"abcdef"匹配。這種匹配是對(duì)前綴字符數(shù)量的精確匹配。 |
( <!...) | 如果字符串當(dāng)前位置的前綴字符串不是給定的正文,就匹配,是( <=...)的反操作。 |
正則表達(dá)式還支持一些處理標(biāo)志,它會(huì)影響正則式的執(zhí)行方法。
處理標(biāo)志
標(biāo)志 | 描述 |
---|---|
I或IGNORECASE | 忽略表達(dá)式的大小寫來(lái)匹配文本。 |
2.操作
通過(guò)re模塊,我們就可在python中利用正則式對(duì)字符串進(jìn)行搜索、抽取和替換操作。如:re.search()函數(shù)能執(zhí)行一個(gè)基本的搜索操作,它能返回一個(gè)MatchObject對(duì)象。re.findall()函數(shù)能返回匹配列表。
>>> import re
>>> a="this is my re module test"
>>> obj = re.search(r'.*is',a)
>>> print obj
<_sre.SRE_Match object at 0xb7d7a218>
>>> obj.group()
'this is'
>>> re.findall(r'.*is',a)
['this is']
MatchObject對(duì)象方法
方法 | 描述 |
---|---|
expand(template) | 展開模板中用反斜線定義的內(nèi)容。 |
m.group([group,...]) | 返回匹配的文本,是個(gè)元組。此文本是與給定group或由其索引數(shù)字定義的組匹配的文本,如果沒(méi)有組定組名,則返回所有匹配項(xiàng)。 |
m.groups([default]) | 返回一個(gè)元組,該元組包含模式中與所有組匹配的文本。如果給出default參數(shù),default參數(shù)值就是與給定表達(dá)式不匹配的組的返回值。default參數(shù)的默認(rèn)取值為None。 |
m.groupdict([default]) | 返回一個(gè)字典,該字典包含匹配的所有子組。如果給出default參數(shù),其值就是那些不匹配組的返回值。default參數(shù)的默認(rèn)取值為None。 |
m.start([group]) | 返回指定group的開始位置,或返回全部匹配的開始位置。 |
m.end([group]) | 返回指定group的結(jié)束位置,或返回全部匹配的結(jié)束位置。 |
m.span([group]) | 返回兩元素組,此元組等價(jià)于關(guān)于一給定組或一個(gè)完整匹配表達(dá)式的(m.start(group),m.end(group)))列表 |
m.pos | 傳遞給match()或search()函數(shù)的pos值。 |
m.endpos | 傳遞給match()或search()函數(shù)的endpos值。 |
m.lastindex | |
m.lastgroup | |
m.re | 創(chuàng)建這個(gè)MatchObject對(duì)象的正則式對(duì)象 |
m.string | 提供給match()或search()函數(shù)的字符串。 |
使用sub()或subn()函數(shù)可在字符串上執(zhí)行替換操作。sub()函數(shù)的基本格式如下:
sub(pattern,replace,string[,count])
示例
>>> str = 'The dog on my bed'
>>> rep = re.sub('dog','cat',str)
>>> print rep
The cat on my bed
replace參數(shù)可接受函數(shù)。要獲得替換的次數(shù),可使用subn()函數(shù)。subn()函數(shù)返回一個(gè)元組,此元組包含替換了的文本和替換的次數(shù)。
如果需用同一個(gè)正則式進(jìn)行多次匹配操作,我們可把正則式編譯成內(nèi)部語(yǔ)言,提高處理速度。編譯正則式用compile()函數(shù)來(lái)實(shí)現(xiàn)。compile()函數(shù)的基本格式如下:
compile(str[,flags])
str表示需編譯的正則式串,flags是修飾標(biāo)志符。正則式被編譯后生成一個(gè)對(duì)象,該對(duì)象有多種方法和屬性。
正則式對(duì)象方法/屬性
方法/屬性 | 描述 |
---|---|
r.search(string[,pos[,endpos]]) | 同search()函數(shù),但此函數(shù)允許指定搜索的起點(diǎn)和終點(diǎn) |
r.match(string[,pos[,endpos]]) | 同match()函數(shù),但此函數(shù)允許指定搜索的起點(diǎn)和終點(diǎn) |
r.split(string[,max]) | 同split()函數(shù) |
r.findall(string) | 同findall()函數(shù) |
r.sub(replace,string[,count]) | 同sub()函數(shù) |
r.subn(replace,string[,count]) | 同subn()函數(shù) |
r.flags | 創(chuàng)建對(duì)象時(shí)定義的標(biāo)志 |
r.groupindex | 將r'( Pid)'定義的符號(hào)組名字映射為組序號(hào)的字典 |
r.pattern | 在創(chuàng)建對(duì)象時(shí)使用的模式 |
轉(zhuǎn)義字符串用re.escape()函數(shù)。
通過(guò)getattr獲取對(duì)象引用
>>> li=['a','b']
>>> getattr(li,'append')
>>> getattr(li,'append')('c') #相當(dāng)于li.append('c')
>>> li
['a', 'b', 'c']
>>> handler=getattr(li,'append',None)
>>> handler
<built-in method append of list object at 0xb7d4a52c>
>>> handler('cc') #相當(dāng)于li.append('cc')
>>> li
['a','b','c','cc']
>>>result = handler('bb')
>>>li
['a','b','c','cc','bb']
>>>print result
None
相關(guān)文章
Django 創(chuàng)建后臺(tái),配置sqlite3教程
今天小編就為大家分享一篇Django 創(chuàng)建后臺(tái),配置sqlite3教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11python 判斷l(xiāng)inux進(jìn)程,并殺死進(jìn)程的實(shí)現(xiàn)方法
今天小編就為大家分享一篇python 判斷l(xiāng)inux進(jìn)程,并殺死進(jìn)程的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07用Python從零實(shí)現(xiàn)貝葉斯分類器的機(jī)器學(xué)習(xí)的教程
這篇文章主要介紹了用Python從零實(shí)現(xiàn)貝葉斯分類器的教程,樸素貝葉斯算法屬于機(jī)器學(xué)習(xí)中的基礎(chǔ)內(nèi)容、實(shí)用而高效,本文詳細(xì)展示了用Python語(yǔ)言實(shí)現(xiàn)的步驟,需要的朋友可以參考下2015-03-03python+django+selenium搭建簡(jiǎn)易自動(dòng)化測(cè)試
這篇文章主要介紹了python+django+selenium搭建簡(jiǎn)易自動(dòng)化測(cè)試,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08Python異常處理try語(yǔ)句應(yīng)用技巧實(shí)例探究
異常處理在Python中是至關(guān)重要的,try-except是用于捕獲和處理異常的核心機(jī)制之一,本文就帶大家深入了解如何使用try-except,處理各種異常情況2024-01-01Python實(shí)現(xiàn)對(duì)中文文本分段分句
這篇文章主要為大家詳細(xì)介紹了如何利用Python實(shí)現(xiàn)對(duì)中文文本分段分句,大致來(lái)說(shuō)主要是以中文的句號(hào)、感嘆、問(wèn)號(hào)等符號(hào)進(jìn)行分句,感興趣的可以了解一下2023-03-03Python實(shí)現(xiàn)中文字轉(zhuǎn)中文語(yǔ)音
這篇文章主要為大家詳細(xì)介紹了如何使用Python實(shí)現(xiàn)中文字轉(zhuǎn)中文語(yǔ)音功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-12-12python神經(jīng)網(wǎng)絡(luò)特征金字塔FPN原理
這篇文章主要為大家介紹了python神經(jīng)網(wǎng)絡(luò)特征金字塔FPN原理的解釋,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05