還不會正則?

2021-02-18 python爬蟲人工智慧大數據

來源: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'


這種場景在實際中也經常用得到。比如當我們需要篩選某一個文件裡面的郵箱時,就要使用到$規則去匹配。下面就以163.com結尾郵箱為例,演示一段代碼:

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']

sub 將匹配到的數據進行替換---->>結果仍然是字符串

需求:將匹配到的字符替換為Python全家桶

In [33]: ret = re.sub(r"\d+", 'Python全家桶', "age=23")

In [34]: ret
Out[34]: 'age=Python全家桶

split 根據匹配進行切割字符串---->>返回一個列表

需求:切割字符串「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爬蟲人工智慧大數據公眾號

相關焦點

  • 還不會正則表達式?看這篇!
    大家都很多時候都會覺得正則表達式難記、難學、難用,但不可否認的是正則表達式是一項很重要的技能,所有我將學習和使用正則表達式時的關鍵點整理如下,供大家參考。不同語言中的正則表達式寫法有少許差異,本文將使用Javascript中的語法。什麼是正則表達式?
  • 正則表達式真的很6,可惜你不會寫
    限定 0 到 9 可以寫成 [0-9]限定 A-Z 寫成 [A-Z]限定某些數字 [165]那上面的正則我們還改成這樣:1 ^((13[0-2])|(15[56])|(18[5-6])|145|176)\d{8}$無論是零寬還是斷言,聽起來都古古怪怪的,那先解釋一下這兩個詞。
  • 正則極簡教程,再也不會學了忘
    由於當時前後端夥伴都在場,故只講了正則基本語法,並沒有涉及宿主環境的 API。本文是這次分享內容的總結。正則是字符串匹配模式,在處理文本時很有用。最常見的操作就是用於查找和替換。說到處理文本,其實我們每天敲的代碼就是文本,因此常用的代碼編輯器的查找替換工具基本都支持正則語法的。
  • 正則表達式真的很騷,可惜你不會寫!!!
    他們都提供相應的接口/函數支持正則表達式。但很神奇的是:無論你大學選擇哪一門計算機語言,都沒有關於正則表達式的課程給你修,在你學會正則之前,你只能看著那些正則大師們,寫了一串外星文似的字符串,替代了你用一大篇幅的if else代碼來做一些數據校驗。
  • 正則表達式入門教程 + 免費在線正則測試工具推薦
    正則表達式在計算機領域幾乎無所不在,但它又很難掌握,新手容易犯暈。如果你還處於入門學習階段,單靠腦子憑空寫一些複雜的正則,很難保證準確性,後面往往要花費大量時間去調試。其實,藉助一些可視化的正則測試工具網站,不僅能節省大量時間,還能對正則有更深的理解……什麼是正則表達式?
  • python正則表達式
    Bat(wo)+man 不會匹配字符串'The Adventures of Batman',因為加號要求 wo 110至少出現一次。111'''112113#7.3.6用花括號匹配特定次數114'''115如果想要一個分組重複特定次數,就在正則表達式中該分組的後面,跟上花括號包圍的數字。116例如,正則表達式(Ha){3}將匹配字符串'HaHaHa',但不會匹配'HaHa',因為後者只重複了117(Ha)分組兩次。
  • Python正則表達式總結
    正則表達式中^表示匹配行的開頭,默認模式下它只能匹配字符串的開頭;而在多行模式下,它還可以匹配 換行符\n後面的字符。注意:正則語法中^匹配行開頭、\A匹配字符串開頭,單行模式下它兩效果一致,多行模式下\A不能識別\n。5.
  • Perl教程 - 正則表達式
    ,它與Tcl等語言中的正則表達式有一定的相似之處,因此如果學習過相關正則表達式的話這個不會很難。https://wenku.baidu.com/view/baa401f5dd88d0d233d46ab5.html正則表達式的三種形式:    首先我們應該知道Perl程序中,正則表達式有三種存在形式,他們分別是:匹配:m/<regexp>/(還可以簡寫為/<regexp>/,略去m)替換:s/&
  • JavaScript高級什麼是正則以及正則表達式的簡單運用
    在實際開發中 ,經常會用到一些表單的驗證 ,提交表單的時候一般都會預校驗 ,比如手機號填寫是否合格 ,用戶暱稱填寫是否規範等 ,這些就要用到正則表達式什麼是正則表達式?用於匹配規律規則的表達式,正則表達式最初是科學家對人類神經系統的工作原理的早期研究,現在在程式語言中有廣泛的應用。正則表通常被用來檢索、替換那些符合某個模式(規則)的文本。
  • 看完你就會正則表達式了
    最近看了一篇關於正則表達式的學習筆記,覺得講的非常好,更有圖形化的神器相助,想不學會都難,所以想轉給大家看看。話說不是開發為啥要學正則表達式這種看似很晦澀的東西呢,因為現在很多搜索的場景都是支持正則表達式的,學會了正則表達式就有如一把利劍在手。本文較長,建議抽40分鐘完整的時間一次讀完再慢慢消化。
  • 實戰JS正則表達式
    [使用正則表達式]:正則對象的方法是指這樣使用的: RegExp對象.方法(字符串)字符串對象的方法是這樣使用:字符串.方法(RegExp對象)一、 正則對象的屬性和方法1.1 正則對象的屬性:ignoreCase //返回一個布爾值表示正則對象是否設置了
  • 給JAVA程式設計師的正則表達式一課
    「不會正則表達式,就算寫遍代碼也嘛不是」。說到正則表達式,可能動態語言的碼農Perl,Python,JS甚至是Golang的開發人員可能都熟悉。對Java碼農來說,可能CURD手到擒來,Spring Stuts Hibernat耳聞能詳,但是說到Regex RE模式,可能熟練的少。那麼,今天蟲蟲就來給廣大Java碼農來補補正則的課。
  • 正則動量面面觀
    (3)通常還假設它滿足規範條件(橫場條件)現在問題來了:這時的正則動量p是什麼?按照分析力學的正則動量的定義[1],它是前面還提到:正則動量依賴於規範的選擇。所以,「正則角動量的z分量守恆」這個結論,其實只在對稱規範下才成立,如果換一個規範的話,守恆量就是別的量了。比如我們重新選擇所謂的朗道規範
  • Python中的正則表達式
    什麼是正則表達式正則表達式是用於處理字符串的強大工具,它使用預定義的特定模式去匹配一類具有共同特徵的字符串,主要用於快速、準確地完成複雜字符串的查找、替換等。正則表達式進行匹配的流程如下圖所示:正則表達式匹配過程是:依次拿出表達式和文本中的字符比較,如果每一個字符都能匹配,則匹配成功;一旦有匹配不成功的字符則匹配失敗。
  • 正則表達式在VBA中間是如何應用?正則表達式的實現方式?
    Hi,大家好,本章節開始將會從零開始和大家用圖文的方式,讓你從零基礎學會正則表達式!有興趣的小夥伴可以持續關注我,或者在專欄中進行查看自我學習,願與君攜手前行!在上一個章節說到正則表達式的入門級知識點,本節將會與大家分享一下正則表達式的是具體實現方式是怎麼樣的?
  • 正則表達式
    在我看來,正則表達式的主要用途有兩種:①查找特定的信息②查找並編輯特定的信息,也就是我們經常用的替換。。比如我們要在Word,記事本等裡面使用快捷鍵Ctrl+F,進行查找一個特定的字符,或者替換一個字符,這就使用了正則表達式。         正則表達式的功能非常強大,尤其是在文本數據進行處理中顯得更加突出。
  • 圖解正則表達式,這一篇就夠了
    所以,就讓我們揭開正則表達式的神秘面紗!如果你理解正則表達式,它會突然變成一個超快速和強大的工具……但你首先需要理解它,老實說,我覺得新手可能會對它望而生畏!讓我們從基礎開始。正則表達式(regex)是什麼?它們的用途是什麼?
  • 刨根究底正則表達式(1):開篇
    正則表達式目前市面上並不缺乏專業著作,比如那本被譽為正則表達式學習聖經的《精通正則表達式》就很值得一讀,另外該書的譯者餘晟先生所寫的《正則指引》也不錯。如果僅用於入門,則《正則表達式必知必會》肯定不能錯過,還有網上流傳極廣的《正則表達式30分鐘入門教程》也是不錯的入門資料。但是,結合我自身痛苦的正則表達式學習經歷和運用體會,僅有這些是遠遠不夠的。
  • Python 正則表達式
    最簡單的正則表達式就是普通字符串,可以匹配其自身。比如,正則表達式 『hello』 可以匹配字符串 『hello』。要注意的是,正則表達式並不是一個程序,而是用於處理字符串的一種模式,如果你想用它來處理字符串,就必須使用支持正則表達式的工具,比如 Linux 中的 awk, sed, grep,或者程式語言 Perl, Python, Java 等等。
  • Python正則表達式,這一篇就夠了!
    正則表達式中^表示匹配行的開頭,默認模式下它只能匹配字符串的開頭;而在多行模式下,它還可以匹配 換行符\n後面的字符。注意:正則語法中^匹配行開頭、\A匹配字符串開頭,單行模式下它兩效果一致,多行模式下\A不能識別\n。5.