話說這個正則,我的第一印象就是我在看到別人的爬蟲代碼的時候,別人提取網(wǎng)站用的.*?,不過我當時也不知道什么是正則,怎么用,為什么這么寫,完全看不懂
下面我記錄一下正則表達式的用法
首先,
import re
my_str = '我在哪,我在車上'
mytest = re.findall(r'',my_str)
基本框架如上第三行,我們需要在 r '這里寫你的正則表達式'
一、關(guān)于re.findall(r'',str)
一、基本用法
比如
1、
import re
my_str = '我在哪,我在車上'
mytest = re.findall(r'我在',my_str)
print(mytest)
這里我們看到我么你的my_str有兩個'我在',所以輸出結(jié)果是

看我!我把my_str里面所有的'我在'都找出來了!
2、
import re
my_str = '我在哪,我在車上'
mytest = re.findall(r'我在.',my_str)
print(mytest)
這里我們添加了一個 . ,這個點叫做通配符(當然我們?nèi)绻?個效果就是兩個)

.是為了匹配'我在' 和 后面的一個字符
3、
import re
my_str = '我1在哪3,我4在車5上67'
mytest = re.findall(r'[0-9]',my_str)
print(mytest)
[]可以用來尋找數(shù)字,0-9表示范圍

當然不在這個范圍內(nèi)的就不會提取出來
二、這里介紹一下幾個特殊的符號用法 錨點元字符 ^ 和 $*
import re
my_str = '我1在哪3,我4在車5上67'
mytest = re.findall(r'^我',my_str)
print(mytest)

相對前面加一個^,表示從第一個匹配'我'
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é)省時間,提高效率
當然,{}也可以是范圍, 如
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ù)差不多,只是它是表示匹配o的任意多個而已
2、 + 我們來看看它和*有何不同
import re
my_str = 'welcome toooooooooooa my class andwelcome looking'
mytest = re.findall(r'to+a',my_str)
print(mytest)

表面上看上去沒區(qū)別呀!但是其實是有區(qū)別的,*代表任意多個(包含0個),而+不是,如果這里沒有o,則該正則表達式找不到所匹配字符
3、 ? 繼續(xù)上代碼!
import re
my_str = 'welcome toooooooooooa my class andwelcome looking'
mytest = re.findall(r'to?a',my_str)
print(mytest)

這個時候我們發(fā)現(xiàn)沒匹配到!原因很簡單,o?只能匹配0個或者1個,多于1個就不行!
六、 | 的使用
import re
my_str = 'welcome to my class to andwelcome welcome class looking'
mytest = re.findall(r'welcome|to|class',my_str)
print(mytest)

滿足其中之一(用 | 隔開的為一個),就匹配
七、字符組 []
import re
my_str = 'wawaa wawab wawac wawad'
mytest = re.findall(r'wawa[acd]',my_str)
print(mytest)

[]里面是隨機之一,符合就匹配
[0-9]或者[a-z]或者[A-Z]更可以[A-Za-z0-9]一起用都是可以的!另外啰嗦一句與之相反的是[^A-Za-z0-9]

這里順便插入一下,只是已經(jīng)定義好了的,可以直接使用了

貪婪模式和非貪婪模式,一般來說默認貪婪模式
另外,說一下關(guān)于re. 的其他用法
1、re.match #從一開始進行匹配,第一個如果是的話返回一個對象和一個位置
2、re.search #若有,則從文本中返回找到的第一個的匹配值的對象和位置
3、re.sub(r'替換前','替換后',str) ,這個用的比較多,可以對于要匹配的進行替換,然后輸出

開心到哭泣,也不知道大佬什么時候可以帶我爬蟲qaq