其實自己之前也用過正則表達式,但一直沒在python中用過,也沒有系統的總結過,今天嘗試給大家一步一步總結一下。
正則表達式到底是個啥?我們在處理字符串時,經常會有查找符合某些複雜規則的字符串的需要,比如查電話、出生日期等等。正則表達式就是用于描述這些規則的工具。換句話說,正則表達式就是記錄文本規則的代碼。
換一個更容易理解的說法:你肯定使用過Windows/Dos下用于文件查找的通配符,比如*和?。如果你想查找某個目錄下的所有的Word文檔的話,你會搜索*.doc。在這裡,*會被解釋成任意的字符串。和通配符類似,正則表達式也是用來進行文本匹配的工具,隻不過比起通配符,它能更精确地描述你的需求——當然,代價就是正則表達式更複雜。慢慢看。
入門假設你在一字符串裡查找Cookie,你可以使用正則表達式r"Cookie"。
pattern = r"Cookie"
sequence = "Cookie 關注codewar 自學python"
if re.match(pattern, sequence):
print("Match!")
else: print("Not a match!")
輸出為Match!,就說明我們用r"Cookie"在字符串中找到了Cookie。我想你肯定注意到了Cookie之前的r,這個叫做“原始字符串”raw string literal。為什麼正則前面都要加原始字符串r呢?
問的非常棒!
因為正則表達式式中大量使用了\,而\常常被用來作為轉義序列的開始,所以在字符串中需要使用\\進行轉義,這種語法雖然能解決問題,明顯,若應用場景再複雜點,可讀性是非常差的。如果不需要轉義直接讓機器明白這個就是個正則表達式而不是其他普通字符串,該有多好!
而我們看到的正則表達式前的r就是這個作用。
w 和 ^的使用小例子我覺得學習正則表達式的最好方法是從例子開始,理解例子之後再自己對例子進行修改,進而成為自己的東西。下面就來看一個w 和 ^的使用的小例子
看下面的例子
import re
xx = "關注codewar,自學python"
r1 = re.findall(r"^\w ",xx)
print(r1)
注意上面的例子中我們将W後面的 去掉的話就隻能匹配出一個“關”字了。 的意思就是匹配1個或多個字符。
re.split 中使用\s的例子
"s": 匹配空白字符
re.split是用來切分字符串的函數,其中\s可以幫助我們定位切分點,看例子
re.split(r'\s','we are splitting the words')
可以看到,給定的字符串以空格被切分開了。注意我們如果不加\的話,上面的方法便是以字母s進行切分
可以看到因為沒有加\,上面的字符串以s被切分為了3段。像這種加上了\就擁有了特殊含義的正則類稱為特殊字符類。常見的特殊字符類如下圖:
re的方法介紹
下面給大家總結一下re庫中常見的方法及使用,
注意,基于正則表達式的.match()方法隻從字符串的開頭搜索,而.search()會整個字符串查找,直到找到一個匹配。
下面我們還是來分别看例子
list = ["guru99 get", "guru99 give", "guru selenium"]
for element in list:
z = re.match("(g\w )\W(g\w )", element)
if z:
print((z.groups()))
可以看到"w " and "\W"并在前面加上“g”會匹配出所有以g開頭的字符串。
再看一個re.search()的例子:
patterns = ['software testing', 'guru99']
text = 'software testing is fun?'
for pattern in patterns:
print('Looking for "%s" in "%s" ->' % (pattern, text), end=' ')
if re.search(pattern, text):
print('found a match!')
else:
print('no match')
通過以上兩個例子就可以深刻的領會到re.match()和re.search()的區别。match() 從第一個字符開始找, 如果第一個字符就不匹配就返回None, 不繼續匹配. 用于判斷字符串開頭或整個字符串是否匹配,速度快。 search() 會整個字符串查找,直到找到一個匹配。
Flags參數很多的正則表達式方法都有一個可選參數flags,這個參數就是正則表達式的修飾符,正則表達式修飾用來規定正則表達式執行匹配的一些方式。為了更好理解修飾符,我們還是來看例子:
xx = """guru99
careerguru99
selenium"""
k1 = re.findall(r"^\w", xx)
k2 = re.findall(r"^\w", xx, re.M)
print(k1)
print(k2)
這就是一個使用re.M的例子,re.M可以返回多行模式,以上例子可以看出的是:如果沒有re.M,函數隻在第一行執行搜索,加上re.M後每一行都執行。
常見的正則表達式修飾給大家總結如下:
總結
今天嘗試着給大家總結了python中正則表達式的知識和re庫的使用例子,寫的遠遠不完全,大家僅作參考。感謝大家耐心看完。發表這些東西的主要目的就是督促自己,希望大家關注評論指出不足,一起進步。内容我都會寫的很細,用到的數據集也會在原文中給出鍊接,你隻要按照文章中的代碼自己也可以做出一樣的結果,一個目的就是零基礎也能懂,因為自己就是什麼基礎沒有從零學Python的,加油。
(站外鍊接發不了,請關注後私信回複“數據鍊接”獲取本頭條号所有使用數據)
往期精彩:
python數據分析:用python在地圖上标出紐約槍擊案
python應用實戰:給圖片添加文本
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!