2020-04-18 今天我來總結(jié)一下正則表達式

話說這個正則,我的第一印象就是我在看到別人的爬蟲代碼的時候,別人提取網(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) ,這個用的比較多,可以對于要匹配的進行替換,然后輸出

*當然,re.的用法還有很多,不過常見的就是這幾種,好啦,今天的記錄到此位置qwq
開心到哭泣,也不知道大佬什么時候可以帶我爬蟲qaq
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容