話說這個(gè)正則氛驮,我的第一印象就是我在看到別人的爬蟲代碼的時(shí)候,別人提取網(wǎng)站用的.*?,不過我當(dāng)時(shí)也不知道什么是正則济似,怎么用矫废,為什么這么寫盏缤,完全看不懂
下面我記錄一下正則表達(dá)式的用法
首先,
import re
my_str = '我在哪蓖扑,我在車上'
mytest = re.findall(r'',my_str)
基本框架如上第三行唉铜,我們需要在 r '這里寫你的正則表達(dá)式'
一、關(guān)于re.findall(r'',str)
一律杠、基本用法
比如
1潭流、
import re
my_str = '我在哪,我在車上'
mytest = re.findall(r'我在',my_str)
print(mytest)
這里我們看到我么你的my_str有兩個(gè)'我在'俩功,所以輸出結(jié)果是
看我幻枉!我把my_str里面所有的'我在'都找出來了!
2诡蜓、
import re
my_str = '我在哪熬甫,我在車上'
mytest = re.findall(r'我在.',my_str)
print(mytest)
這里我們添加了一個(gè) . ,這個(gè)點(diǎn)叫做通配符(當(dāng)然我們?nèi)绻?個(gè)效果就是兩個(gè))
.是為了匹配'我在' 和 后面的一個(gè)字符
3、
import re
my_str = '我1在哪3蔓罚,我4在車5上67'
mytest = re.findall(r'[0-9]',my_str)
print(mytest)
[]可以用來尋找數(shù)字椿肩,0-9表示范圍
當(dāng)然不在這個(gè)范圍內(nèi)的就不會(huì)提取出來
二、這里介紹一下幾個(gè)特殊的符號(hào)用法 錨點(diǎn)元字符 ^ 和 $*
import re
my_str = '我1在哪3豺谈,我4在車5上67'
mytest = re.findall(r'^我',my_str)
print(mytest)
相對前面加一個(gè)^,表示從第一個(gè)匹配'我'
import re
my_str = '我1在哪3郑象,我4在車5上67'
mytest = re.findall(r'我$',my_str)
print(mytest)
在my_str最后尋找'我',然鵝最后是67茬末,顯然找不到
我們看看^和&一起用是什么效果
import re
my_str = '我'
mytest = re.findall(r'^我$',my_str)
print(mytest)
只有my_str這樣才能找到滿足頭尾都是'我'的字符串
三厂榛、單詞邊界\b
import re
my_str = 'welcome to my class andwelcome looking'
mytest = re.findall(r'\bwelcome\b',my_str)
print(mytest)
通常情況下,英文單詞一般是按空格隔開的丽惭,所以\b的用法就是用來判斷取英語單詞击奶,像我上面的例子就是取'welcome' (所以welcom前后都加了邊界)
四、控制次數(shù){}
import re
my_str = 'welcome toooooooooooa my class andwelcome looking'
mytest = re.findall(r'to{11}',my_str)
print(mytest)
上面的{11}是對于o的次數(shù)控制责掏,是為了節(jié)省時(shí)間柜砾,提高效率
當(dāng)然,{}也可以是范圍换衬, 如
import re
my_str = 'welcome toooooooooooa my class andwelcome looking'
mytest = re.findall(r'to{2,11}a',my_str)
print(mytest)
這里就舉的關(guān)于o{2,11}的例子
五痰驱、* + ? 的使用
1、*
import re
my_str = 'welcome toooooooooooa my class andwelcome looking'
mytest = re.findall(r'to*a',my_str)
print(mytest)
*其實(shí)和{}控制次數(shù)差不多瞳浦,只是它是表示匹配o的任意多個(gè)而已
2担映、 + 我們來看看它和*有何不同
import re
my_str = 'welcome toooooooooooa my class andwelcome looking'
mytest = re.findall(r'to+a',my_str)
print(mytest)
表面上看上去沒區(qū)別呀!但是其實(shí)是有區(qū)別的术幔,*代表任意多個(gè)(包含0個(gè))另萤,而+不是,如果這里沒有o,則該正則表達(dá)式找不到所匹配字符
3、 ? 繼續(xù)上代碼四敞!
import re
my_str = 'welcome toooooooooooa my class andwelcome looking'
mytest = re.findall(r'to?a',my_str)
print(mytest)
這個(gè)時(shí)候我們發(fā)現(xiàn)沒匹配到泛源!原因很簡單,o?只能匹配0個(gè)或者1個(gè)忿危,多于1個(gè)就不行达箍!
六、 | 的使用
import re
my_str = 'welcome to my class to andwelcome welcome class looking'
mytest = re.findall(r'welcome|to|class',my_str)
print(mytest)
滿足其中之一(用 | 隔開的為一個(gè))铺厨,就匹配
七缎玫、字符組 []
import re
my_str = 'wawaa wawab wawac wawad'
mytest = re.findall(r'wawa[acd]',my_str)
print(mytest)
[]里面是隨機(jī)之一,符合就匹配
[0-9]或者[a-z]或者[A-Z]更可以[A-Za-z0-9]一起用都是可以的解滓!另外啰嗦一句與之相反的是[^A-Za-z0-9]
這里順便插入一下赃磨,只是已經(jīng)定義好了的,可以直接使用了
貪婪模式和非貪婪模式洼裤,一般來說默認(rèn)貪婪模式
另外邻辉,說一下關(guān)于re. 的其他用法
1、re.match #從一開始進(jìn)行匹配腮鞍,第一個(gè)如果是的話返回一個(gè)對象和一個(gè)位置
2值骇、re.search #若有,則從文本中返回找到的第一個(gè)的匹配值的對象和位置
3移国、re.sub(r'替換前','替換后',str) ,這個(gè)用的比較多吱瘩,可以對于要匹配的進(jìn)行替換,然后輸出
開心到哭泣部逮,也不知道大佬什么時(shí)候可以帶我爬蟲qaq