來源:Python全家桶 連結:
https://mp.weixin.qq.com/s/-a0UMd2cr5sjBRv0ol4GEQ
最近算法的精度受限於圖片數量的不足,導致精度無法提升,需要通過爬蟲來爬取大量的圖片來豐富圖片數據集。作為整個公司唯二會Python的工程師之一(也許是另一位Python大佬太優秀,搬磚的任務還得小弟親自來),爬蟲的任務當仁不讓的就落到小弟(小編本文)身上了。苦於好久沒有做過爬蟲,正則表達式的一些使用和匹配規則記得不太清楚了,於是就系統的複習了一遍。
今天就藉此機會給大家分享一下正則表達式的使用。
概念:
一說正則表達式,也許很多人都清楚怎麼使用,卻說不出正則表達式到底是什麼,所以先看看百度百科是如何定義正則表達式的:「正則表達式是對字符串(包括普通字符(例如,a 到 z 之間的字母)和特殊字符(稱為「元字符」))操作的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個「規則字符串」,這個「規則字符串」用來表達對字符串的一種過濾邏輯。正則表達式是一種文本模式,模式描述在搜索文本時要匹配的一個或多個字符串。"
目的:
從這個定義中可以看出正則表達式無非做兩件事:
1.寫正則表達式;
2.正則匹配、提取結果
特點:
1. 靈活性、邏輯性和功能性非常強;
2. 可以迅速地用極簡單的方式達到字符串的複雜控制。
3. 對於剛接觸的人來說,比較晦澀難懂。
場景:
當然正則表達式應用的場景也非常多。常見的比如:搜尋引擎的搜索、爬蟲結果的匹配、文本數據的提取等等都會用到,所以掌握甚至精通正則表達式是一個硬性技能,非常必要。
上邊對正則表達式的一些概念性的東西做了一個簡單的說明,要是感覺還不是很理解,可以找度娘深入了解一下。接下來就是一些操作了。
不知道別的語言是如何使用正則表達式的,在Python中需要通過正則表達式對字符串進行匹配的時候,直接使用Python的內置模塊re即可。
re.match() 能夠匹配出以固定字符開頭的字符串
# 導入re模塊
import re
# 使用match方法進行匹配操作
result = re.match(正則表達式,要匹配的字符串)
# 如果上一步匹配到數據的話,可以使用group方法來提取數據
result.group()
實例操作:
In [4]: import re
In [5]: ret = re.match("lph", "lph.com")
In [6]: ret.group()
Out[6]: 'lph'
下面的表是正則表達式的單個字符的匹配。
下面通過一些簡單的實例來看幾個用法,這一部分很簡單,剩餘的就不做過多的演示,大家可以參考上邊的表格自己去實操一下
import re
# 匹配任意一個字符串
In [9]: ret = re.match("l.h","lph")
In [10]: ret.group()
Out[10]: 'lph'
# 匹配[ ]中列舉的字符
In [11]: ret = re.match("[Lh]","Lph")
In [12]: ret.group()
Out[12]: 'L'
# 使用\d進行匹配
In [13]: ret = re.match("lph\d", "lph1frp")
In [14]: ret.group()
Out[14]: 'lph1'
在實際工作中大多時候匹配的是多個字符,不再是一個字符。所以這一部必須熟悉。
下面演示一下多字符匹配使用:
# *的匹配
需求:匹配出,一個字符串第一個字母為小寫字符,後面都是大寫字母並且這些大寫字母可有可無
In [15]: ret = re.match("[a-z][A-Z]*", "aBcdE")
In [16]: ret.group()
Out[16]: 'aB'
# +的匹配
需求:匹配出,變量名是否有效
names = ["name1", "_name", "2_name", "__name__"]
for name in names:
ret = re.match("[a-zA-Z_]+[\w]*",name)
if ret:
print("變量名 %s 符合要求" % ret.group())
else:
print("變量名 %s 非法" % name)
--->>>
變量名 name1 符合要求
變量名 _name 符合要求
變量名 2_name 非法
變量名 __name__ 符合要求
# ?的匹配
需求:匹配出,a-z之間字符
In [17]: ret = re.match("[a-z]?\d", "c55")
In [18]: ret.group()
Out[18]: 'c5'
# 匹配{m}
需求:匹配出,6位的密碼,可以是大小寫英文字母、數字、下劃線
In [19]: ret = re.match("[a-zA-Z0-9_]{6}","12a3g45678")
In [20]: ret.group()
Out[20]: '12a3g4'
# 匹配{m,n}
需求:匹配出,8-20位的密碼,可以是大小寫英文字母、數字、下劃線
In [22]: ret = re.match("[a-zA-Z0-9_]{8,20}","1ad12f23s34455ff66")
In [23]: ret.group()
Out[23]: '1ad12f23s34455ff66'
import re
email_list = ["laoli@163.com", "laoli@163.csf.com", ".com.xiaowang@qq.com"]
for email in email_list:
ret = re.match("[\w]{4,20}@163\.com$", email)
if ret:
print("%s 是符合規定的郵件地址,匹配後的結果是:%s" % (email, ret.group()))
else:
print("%s 不符合要求" % email)
運行結果如下:
很明顯可以發現,滿足以條件的就只有一個,其餘兩個不是以163.com就被很好的過濾掉了。
上邊看完了基礎用法之後,接下來看幾個正則表達式的高級方法的使用。
需求:匹配出微信某篇文章的閱讀數
In [13]: import re
In [14]: ret = re.search(r"\d+", "文章閱讀量為:35434")
In [15]: ret.group()
Out[15]: '35434'
需求:統計出python、c、c++相應文章閱讀的次數
In [19]: import re
In [20]: ret = re.findall(r"\d+", "python = 9999, c = 7890, c++ = 12345")
In [21]: ret
Out[21]: ['9999', '7890', '12345']
需求:將匹配到的字符替換為Python全家桶
In [33]: ret = re.sub(r"\d+", 'Python全家桶', "age=23")
In [34]: ret
Out[34]: 'age=Python全家桶
需求:切割字符串「age:33 lph python全家桶」
In [35]: ret = re.split(r":| ", "age:33 lph python全家桶")
In [36]: ret
Out[36]: ['age', '33 lph python全家桶']
與大多數程式語言相同,正則表達式裡使用"\"作為轉義字符,這就可能造成反斜槓困擾。假如你需要匹配文本中的字符"\",那麼使用程式語言表示的正則表達式裡將需要4個反斜槓"\\":前兩個和後兩個分別用於在程式語言裡轉義成反斜槓,轉換成兩個反斜槓後再在正則表達式裡轉義成一個反斜槓。
Python裡的原生字符串很好地解決了這個問題,有了原生字符串,你再也不用擔心是不是漏寫了反斜槓,寫出來的表達式也更直觀。
import re
ret = re.match(r"c:\\a", "c:\\a\\b\\c").group()
print(ret)
---->>>運行結果如下:
c:\a
看了上邊的介紹,相信大家對正則表達式使用有了一個清晰的認識。這裡再給大家列舉一些工作中經常會用到的一些正則表達式。
1. Email地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
2. 域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?
3. InternetURL:[a-zA-z]+://[^\s]* 或 ^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$
4. 手機號碼:^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$
5. 身份證號(15位、18位數字):^\d{15}|\d{18}$
6. 短身份證號碼(數字、字母x結尾):^([0-9]){7,18}(x|X)?$ 或 ^\d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$
7. 帳號是否合法(字母開頭,允許5-16位元組,允許字母數字下劃線):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
8. 密碼(以字母開頭,長度在6~18之間,只能包含字母、數字和下劃線):^[a-zA-Z]\w{5,17}$
到這裡,就已經將字符串的基本使用介紹完了,當然這個也是一些初級知識,想要在工作中對正則表達式做到遊刃有餘的話,還需要大家私下不斷地學習與操作。
python爬蟲人工智慧大數據公眾號