python演示解答正則為什么是最強(qiáng)文本處理工具
正則表達(dá)式,又稱規(guī)則表達(dá)式。(英語:Regular Expression,在代碼中常簡(jiǎn)寫為regex、regexp或RE),計(jì)算機(jī)科學(xué)的一個(gè)概念。正則表達(dá)式通常被用來檢索、替換那些符合某個(gè)模式(規(guī)則)的文本。
Python作為一門數(shù)據(jù)處理語言,經(jīng)常使用正則匹配段落,比如爬蟲爬取數(shù)據(jù)時(shí)。正則表達(dá)式是Python內(nèi)置的模塊,不需要額外安裝。
今天來給大家分享一份比較全面的Python正則表達(dá)式寶典,學(xué)會(huì)之后,你將掌握正則表達(dá)式的各種應(yīng)用場(chǎng)景。
re模塊
re (Regular Expression簡(jiǎn)寫),這個(gè)很好記住。
1.導(dǎo)入re模塊
在使用正則表達(dá)式之前,需要導(dǎo)入re模塊。
import re
2.findall()的語法:
導(dǎo)入了re模塊之后就可以使用findall()方法了,
re.findall(pattern, string, flags=0)
參數(shù)
pattern:必填。正則表達(dá)式
string:必填,需要檢索的文本, == 確保沒亂碼 ==
Flags:選填,功能標(biāo)志位
返回?cái)?shù)組
str='a1a2a3' newStr=re.findall('a\d',str ) nullVlue=re.findall('b\d',str) print('newStr匹配個(gè)數(shù):',len(newStr)) print('newStr匹配結(jié)果',newStr) print('nullVlue匹配個(gè)數(shù):',len(nullVlue)) print('nullVlue匹配結(jié)果',nullVlue)
顯示如下:
newStr匹配個(gè)數(shù): 3 newStr匹配結(jié)果 ['a1', 'a2', 'a3'] nullVlue匹配個(gè)數(shù): 0 nullVlue匹配結(jié)果 []
基本語法已經(jīng)介紹完成了。
正則表達(dá)式
1.傻瓜式截取findall
import re text='aaa bbb ccc' rol='aaa (.*) ccc' rul=re.findall(rol ,text) print(rul)
顯示如下:
['bbb']
直接復(fù)制原來的文本,把想要提取的文本替換成(.*)
表達(dá)式解釋:
表示 | 意義 |
---|---|
(pattern) |
表示匹配pattern并獲取這一匹配。要匹配圓括號(hào)字符,請(qǐng)使用""。 |
. |
匹配除“\n"之外的任何單個(gè)字符。要匹配包括"\n"在內(nèi)的任何字符,請(qǐng)使用像"(.|\n)"的模式。 |
* |
匹配前面的子表達(dá)式零次或多次。例如,zo*能匹配“z"以及"zoo"。*等價(jià)于{0,}。 |
增加替代
import re text = '<li><a href="/2/" rel="external nofollow" rel="external nofollow" rel="external nofollow" >動(dòng)作片</a></li> <li><a href="/1/" rel="external nofollow" rel="external nofollow" rel="external nofollow" >喜劇片</a></li>' rol = r'<li><a href=".*?" rel="external nofollow" rel="external nofollow" rel="external nofollow" >(.*?)</a></li>' rul = re.findall(rol, text) print(rul)
顯示:
['動(dòng)作片', '喜劇片']
表達(dá)式解釋:
表示 | 意義 |
---|---|
? |
非貪婪模式盡可能少的匹配所搜索的字符串,而默認(rèn)的貪婪模式則盡可能多的匹配所搜索的字符串。 |
pattern |
不帶( )表示匹配pattern匹配值不獲取~~獲取值不輸出~~。 |
保留獲取
import re text = '<li><a href="/2/" rel="external nofollow" rel="external nofollow" rel="external nofollow" >動(dòng)作片</a></li> <li><a href="/1/" rel="external nofollow" rel="external nofollow" rel="external nofollow" >喜劇片</a></li>' role = r'<li><a href=".*?" rel="external nofollow" rel="external nofollow" rel="external nofollow" >(.*?)</a></li>' resu = re.findall(role , text) rol2=r'(<a href=".*?" rel="external nofollow" rel="external nofollow" rel="external nofollow" >.*?</a>)' rul2 = re.findall(rol2, text) print(resu )
顯示:
['<a href="/2/">動(dòng)作片</a>', '<a href="/1/">喜劇片</a>']
把括號(hào)寫在外面就可以了
傻瓜式的講完了,下面講講限定符
1 - [xyz]
字符集合。匹配所包含的任意一個(gè)字符。例如,“[abc]“可以匹配"plain"中的"a”。
import re text = 'aab 1+23 ss aac 4-56 ss' rol = r'aa(.*?)ss' rul1 = re.findall(rol, text) print(rul1) rol2 = r'aa[bc](.*?)ss' rul1 = re.findall(rol2, text) print(rul1)
輸出:
['b 1+23 ', 'c 4-56 ']
[' 1+23 ', ' 4-56 ']
== 表達(dá)式解釋 ==
①我們可以先把固定的截取下來,紅框部分。
②再通過非截取方式把b和c過濾掉,藍(lán)色部分。
③[ ]提供的就是包含功能
2 - {}
表示 | 意義 |
---|---|
{n} |
n是一個(gè)非負(fù)整數(shù)。匹配確定的n次。例如,“o{2}"不能匹配"Bob"中的"o",但是能匹配"food"中的兩個(gè)o。 |
{n,} |
n是一個(gè)非負(fù)整數(shù)。至少匹配n次。例如,“o{2,}"不能匹配"Bob"中的"o",但能匹配"foooood"中的所有o。"o{1,}"等價(jià)于"o+"。"o{0,}"則等價(jià)于"o*"。 |
{n,m} |
m和n均為非負(fù)整數(shù),其中n<=m。最少匹配n次且最多匹配m次。例如,“o{1,3}"將匹配"fooooood"中的前三個(gè)o。"o{0,1}"等價(jià)于"o?"。請(qǐng)注意在逗號(hào)和兩個(gè)數(shù)之間不能有空格。 |
+ |
匹配前面的子表達(dá)式一次或多次。例如,“zo+"能匹配"zo"以及"zoo",但不能匹配"z"。+等價(jià)于{1,}。。 |
* |
匹配前面的子表達(dá)式零次或多次。例如,zo*能匹配“z"以及"zoo"。*等價(jià)于{0,}。 |
== 難度加大,b和c的個(gè)數(shù)不固定 ==
import re #難度加大,b和c的個(gè)數(shù)不固定 text = 'aabbccbb 1+23 ss aaccb 4-56 ss' rol = r'aa[bc]{3,10}(.*?)ss' rul1 = re.findall(rol, text) print(rul1) rol2 = r'aa[bc](.*?)ss' rul2 = re.findall(rol2, text) print(rul2)
顯示:
[' 1+23 ', ' 4-56 ']
['bccbb 1+23 ', 'cb 4-56 ']
3 - (?:pattern)正則斷言
斷言(Assertions)在正則表達(dá)式概念里面難理解,它通常指的是在目標(biāo)字符串的當(dāng)前匹配位置進(jìn)行的一種測(cè)試但這種測(cè)試并不占用目標(biāo)字符串,也即不會(huì)移動(dòng)模式在目標(biāo)字符串中的當(dāng)前匹配位置。
表示 | 意義 |
---|---|
x|y |
匹配x或y。例如,“z|food"能匹配"z"或"food"。"(z|f)ood"則匹配"zood"或"food"。 |
(?:pattern) |
匹配pattern但不獲取匹配結(jié)果,也就是說這是一個(gè)非獲取匹配,不進(jìn)行存儲(chǔ)供以后使用。這在使用或字符“(|)"來組合一個(gè)模式的各個(gè)部分是很有用。 |
(?=pattern) |
正向肯定預(yù)查,在任何匹配pattern的字符串開始處匹配查找字符串。這是一個(gè)非獲取匹配,也就是說,該匹配不需要獲取供以后使用。 |
(?!pattern) |
正向否定預(yù)查,在任何不匹配pattern的字符串開始處匹配查找字符串。這是一個(gè)非獲取匹配,也就是說,該匹配不需要獲取供以后使用。 |
(?!pattern) |
正向否定預(yù)查,在任何不匹配pattern的字符串開始處匹配查找字符串。這是一個(gè)非獲取匹配,也就是說,該匹配不需要獲取供以后使用。 |
(?<=pattern) |
反向肯定預(yù)查,與正向肯定預(yù)查類擬,只是方向相反。 |
(?<!pattern) |
反向否定預(yù)查,與正向否定預(yù)查類擬,只是方向相反。 |
== 再把開頭字符變得不固定aa和dd,結(jié)尾字符ss,ff ==
import re #難度加大,b和c的個(gè)數(shù)不固定 #再把開頭字符變得不固定aa和dd,結(jié)尾字符ss,ff text = 'aabbccbb 1+23 ss ddccb 4-56 ff' rol = r'aa[bc]{3,10}(.*?)ss' rul1 = re.findall(rol, text) print(rul1) rol2 = r'(?:aa|dd)[bc]{3,10}(.*?)(?:ss|ff)' rul2 = re.findall(rol2, text) print(rul2)
顯示:
[' 1+23 ']
[' 1+23 ', ' 4-56 ']
Python正則flags
編譯標(biāo)志讓你可以修改正則表達(dá)式的一些運(yùn)行方式。多個(gè)標(biāo)志可以通過按位 OR-ing 它們來指定。如 re.I | re.M 。flags都有兩種形式,縮寫和全寫都可以。
表示 | 意義 |
---|---|
re.I或re.IGNORECASE |
忽略大小寫 |
re.L或re.LOCALE |
使用當(dāng)?shù)豯ocale。(python中有個(gè)locale模塊,locale代表不同的語言,地區(qū)和字符集) |
re.U或re.UNICODE |
使用unicode的locale |
re.U或re.UNICODE |
使用unicode的locale |
re.M或re.MULTILINE |
使用^或$時(shí)會(huì)匹配每一行的行首或行尾 |
re.S或re.DOTALL |
使用.時(shí)能匹配換行符 |
re.X或re.VERBOX |
忽略空白字符,而且可以加入注釋 |
re.I
import re #難度加大,b和c的個(gè)數(shù)不固定 #再把開頭字符變得不固定aa和dd,結(jié)尾字符ss,ff #改變字母大小寫 text = 'aAbBCcbb 1+23 Ss Ddccb 4-56 fF' rol = r'(?:aa|dd)[bc]{3,10}(.*?)(?:ss|ff)' rul = re.findall(rol, text) print(rul) rul2 = re.findall(rol, text,re.I) print(rul2)
顯示:
[]
[' 1+23 ', ' 4-56 ']
re.M和re.S
import re #難度加大,b和c的個(gè)數(shù)不固定 #再把開頭字符變得不固定aa和dd,結(jié)尾字符ss,ff #改變字母大小寫 #在中間添加一個(gè)換行符 text = 'aAbBCcbb 1+23 \n Ss Ddccb 4-56 fF' rol = r'(?:aa|dd)[bc]{3,10}(.*?)(?:ss|ff)' rul = re.findall(rol, text,re.I) print(rul) rul2 = re.findall(rol, text,re.I|re.S) print(rul2)
顯示:
[' 4-56 ']
[' 1+23 \n ', ' 4-56 ']
== 結(jié)果說明 ==
①默認(rèn)re.M只會(huì)匹配在當(dāng)前 行(非列) 里面進(jìn)行匹配,“Ss”已經(jīng)換行了,所以“1+23”沒有匹配到。
②re.S表示匹配多行,并且捕獲換行符
③re.S|re.I可以并行使用
# 結(jié)語 正則的匹配方法,已經(jīng)寫完了,號(hào)稱萬能的文本處理工具,下篇開始講解,替換,追加。最后最后,感謝大家關(guān)注!
到此這篇關(guān)于python演示解答正則為什么是最強(qiáng)文本處理工具的文章就介紹到這了,更多相關(guān)python 正則內(nèi)容請(qǐng)搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。