Python爬蟲提取神器,正則表達式(re模塊),全程乾貨!

2021-02-21 Python學習交流樂園
python正則表達式(re模塊)什麼是正則表達式

正則表達式(Regular Expression)是一種文本模式,包括普通字符(例如,a到z之間的字母)和特殊字符(稱為"元字符")。正則表達式使用但個字符串來描述、匹配一系列匹配某個句法規則的字符串。

很多人學習python,不知道從何學起。

很多人學習python,掌握了基本語法過後,不知道在哪裡尋找案例上手。

很多已經做案例的人,卻不知道如何去學習更加高深的知識。

那麼針對這三類人,我給大家提供一個好的學習平臺,免費領取視頻教程,電子書籍,以及課程的原始碼!

QQ群:101677771

正則字符簡單介紹普通字符

普通字符包括沒有顯示指定為元字符的所有可列印和不可列印字符。這包括所有大寫和小寫字母、所有數字、所有標點符號和一些其它符號

特殊字符特別字符描述$匹配輸入字符串的結尾位置。如果設置了RegExp對象的Multline屬性,則$也匹配'\n'或'\r'。()匹配一個子表達式的開始和結束位置(匹配括號中的全部內容)。子表達式可以獲取供以後使用。*匹配前面的子表達式零次或多次。+匹配前面的子表達式一次或多次(至少有一次)。.匹配除換行符\n之外的任何單詞。[ ]匹配括號中一個字符,範圍描述 如[0-9 a-z A-Z]。?匹配前面的子表達式零次或一次,或指明一個非貪婪的限定。\轉義字符,如*表示匹配*號。^匹配字符串的開始位置(用在[ ]時,可以理解為取反,表示不匹配中括號中的字符串)。{}限定匹配的次數,如{n}表示匹配n個字符,{n,}表示至少匹配n個字符,{n,m}表示至少n個,最多m個(m和n均為非負整數)。|兩項中取一項。非列印字符

非列印字符也可以是正則表達式的組成部分。

字符描述\b匹配一個單詞邊界,即字與空格間的位置。("This is Regex匹配單獨的單詞"is",正則就要寫成"\bis\b")。\d匹配數字。\w匹配字母,數字,下劃線。\s匹配空格。\B非單詞邊界匹配。\D匹配非數字。\W匹配非(字母,數字,下劃線)。\S匹配非空格。量詞

量詞的三個重要概念

貪婪(貪心)如"*"字符,貪婪量詞會首先匹配整個字符串,嘗試匹配時,它會選定儘可能多的內容,如果失敗則回退一個字符,然後再次嘗試,回退的過程就叫做回溯,它會每次回退一個字符,直到找到匹配的內容或者沒有字符可以回退。相比下面兩種貪婪量詞對資源的消耗是最大的。

懶惰(勉強)如"?",懶惰量詞使用另一種方法匹配,它從目標的起始位置開始嘗試匹配,每檢查一個字符,並尋找它要匹配的內容,如此循環直到字符串結尾處。

佔有如"+",佔有量詞很像貪心式量詞,它會選擇儘可能多的內容,然後嘗試尋找匹配內容,但它只嘗試一次,不會回溯。就好比先抓一把石頭,然後從石頭中挑出黃金。

re模塊中常用功能函數compile()

編譯正則表達式模式,返回一個對象的模式。(可以把一些常用的正則表達式編譯成正則表達式對象,這樣可以提高效率)。

re.compile(pattern,flags=0)

pattern:編譯時用的表達式字符串。

flags:編譯標誌位,用於修改正則表達式,如:是否區分大小寫,多行匹配等。常用的flags有:

標誌含義re.S(DOTALL)使.匹配包括換行符在內的所有字符。re.I(IGNORECASE)是匹配對大小寫不敏感。re.L(LOCALE)做本地化識別(locale-aware)匹配,法語等。re.M(MULTILINE)多行匹配,影響^和$。re.X(VERBOSE)該標誌通過給予更靈活的格式以便將正則表達式寫的更易於理解。re.U根據Unicode字符集解析字符,這個標誌影響\w、\W、\b、\B

import re

# 將正則表達式編譯成pattern對象
pattern = re.compile("\d+")

pattern對象的常用方法有:match()、search()、finall()、finder()、split()、sub()、subn()。

(1)match()方法

該方法用於查找字符串的頭部,它只要找到一個匹配的結果就返回。(這個方法並不是完全匹配。當pattern結束時若string還要剩餘字符,仍然視為成功。想要完全匹配,可以在表達式末尾加上邊界匹配符'$')。

match(pattern, string,pos=0,endpos=-1)

說明:string是待匹配的字符串,pos和endpos指定字符串的起始和終點的位置,當不指定是,默認從頭部開始匹配,當匹配成功是,返回Match對象。

import re

pattern = re.compile("\\d+")
match = pattern.match("aaa123bbb123ccc123")
print(match) # None(從頭部開始匹配)

match = pattern.match("aaa123bbb123ccc123", 3, 6)
print(match) # <_sre.SRE_Match object; span=(3, 6), match='123'>

print(match.group()) # 123,返回匹配的字符串,如果需要獲得整個匹配的字符串時,可以使用group()或者group(0)
print(match.start()) # 3,返回匹配的字串在整個字符串的起始位置
print(match.end()) # 6,返回匹配的字串在整個字符串的結束位置
print(match.span()) # (3, 6),返回(start(), end())

(2) serach()方法

search(pattern, string,pos=0,endpos=-1)

說明:匹配成功時返回Match對象,匹配不成功時返回None。

import re

pattern = re.compile("\\d+")
match = pattern.search("aaaa1111bbbb1234cccc1243")
print(match) # <_sre.SRE_Match object; span=(4, 8), match='1111'>

match = pattern.search("aaaa1111bbbb1234cccc1243", 3, 6)
print(match) # <_sre.SRE_Match object; span=(4, 6), match='11'>

print(match.group()) # 11
print(match.start()) # 4
print(match.end()) # 6
print(match.span()) # (4, 6)

(3)findall()方法

該方法返回所有的匹配結果。

findall(pattern, string, pos, endpos=-1)

說明:匹配成功,返回匹配的列表,匹配不成功,返回空列表。

import re

pattern = re.compile("\\d+")
match = pattern.findall("aaaa1111bbbb1234cccc1243")
print(match) # ['1111', '1234', '1243']

(4)finditer()方法

finditer(pattern, string, pos=0, endpos=-1)

說明:匹配所有的字符串,返回所有匹配字符串,但是它返回的是一個迭代器,通過該迭代器我們可以訪問匹配的每一個字符串。

import re

pattern = re.compile("\\d+")
result_iter = pattern.finditer("aaaa1111bbbb1234cccc1243")
for result in result_iter:
print("找得到字符串{},位置是{}".format(result.group(), result.span()))
# 找得到字符串1111,位置是(4, 8)
# 找得到字符串1234,位置是(12, 16)
# 找得到字符串1243,位置是(20, 24)

(5)split()方法

split(pattern, string, maxsplit=0)

說明:用來分割字符串,maxsplit表示最大的分割次數,不指定即為全部分割。

import re

print(re.split('\d+', 'one1two2three3four4five5'))
# ['one', 'two', 'three', 'four', 'five', '']

(6)sub()方法

sub(pattern, repl, string, count=0, flags=0)

說明:該方法用來替換。rel如果為字符串,會使用rel替換字符串中的每一個匹配的子串,並且返回替換後的字符串;如果為函數,則該函數應該只接收一個Match對象,並且返回一個字符串用於替換。

count用於指定替換次數。

import re

p = re.compile(r'(\w+) (\w+)')
s = 'test aaa,test bbb'


def func(m):
return 'hei' + ' ' + m.group(2)


print(p.sub(r'hello world', s)) # hello world,hello world(使用hello world替換)
print(p.sub(r'\2 \1', s)) # aaa test,bbb test(\1 上方第一個括號內的內容。)
print(p.sub(func, s)) # hei aaa,hei bbb(替換全部)
print(p.sub(func, s, 1)) # hei aaa,test bbb(最多只替換一次)

(7)subn()方法

subn(pattern, repl, string, count=0, flags=0)

說明:該方法也是用於替換,返回一個元祖,元祖有兩個元素,第一個和使用sub方法返回的結果一樣,count表示替換的次數。

import re

p = re.compile(r'(\w+) (\w+)')
s = 'test aaa,test bbb'


def func(m):
return 'hei' + ' ' + m.group(2)


print(p.subn(r'hello world', s)) # ('hello world,hello world', 2)
print(p.subn(r'\2 \1', s)) # ('aaa test,bbb test', 2) (\1 上方第一個括號內的內容。)
print(p.subn(func, s)) # ('hei aaa,hei bbb', 2)
print(p.subn(func, s, 1)) # ('hei aaa,test bbb', 1)

一些注意點

1、re.match與 re.search 與 re.findall 的區別:

re.match只匹配字符串的開始,如果字符串開始不符合正則表達式,則匹配失敗,函數返回None;而re.search匹配整個字符串,直到找到一個匹配。re.findall返回所有的匹配結果。

import re

p = re.compile(r'[\d]')
s = 'abc33'
print(p.search(s).group()) # 3
print(p.match(s)) # None
print(p.findall(s)) # ['3', '3']

2、貪婪匹配與非貪婪匹配

*,+,?等都是貪婪匹配,也就是儘可能多的匹配,後面加上?號使其變成

惰性匹配。

import re

a = re.findall(r'a(\d+?)', 'a23b')
print(a)
b = re.findall(r'a(\d+)', 'a23b')
print(b)

注意:如果前後均有限定條件的時候,就不存在什麼貪婪模式了,非匹配模式失效。

import re

a = re.findall(r'a(\d+)b', 'a3333b')
print(a)
b = re.findall(r'a(\d+?)b', 'a3333b')
print(b)

相關焦點

  • 妙用正則表達式--Python中的re模塊
    Python中的re模塊可以方便地引入正則表達式。利用正則表達式,我們可以對文本內容進行精確快捷地匹配和提取。與Stata相比,正則表達式的元字符是通用的,不同的是函數。re庫中有若干個函數各司其職,在上一篇推文《Python標準庫re:正則表達式》中我們介紹了re庫中的三個常用函數,現在小編將從實用的角度再介紹幾個常用的函數。
  • Python之re模塊方法詳解(正則表達式)
    學習re模塊首先要對python正則表達式要了解,正則表達式是一個特殊的字符序列,它能幫助你方便的檢查一個字符串是否與某種模式匹配
  • 萬字長文詳解Python正則表達式及re模塊
    本文帶來的是偷學Python第三十一天:Python正則表達式語法及re模塊的使用,其他內容將在近期更新完畢,本文主要將涉及以下內容exp) 零寬度負回顧後發斷言,來斷言此位置的前面不能匹配表達式exp,Python中提供的re模塊使Python擁有全部正則表達式的功能!
  • 推薦|Python 正則表達式 re 模塊簡明筆記
    最簡單的正則表達式就是普通字符串,可以匹配其自身。比如,正則表達式 『hello』 可以匹配字符串 『hello』。re 模塊在 Python 中,我們可以使用內置的 re 模塊來使用正則表達式。有一點需要特別注意的是,正則表達式使用 \ 對特殊字符進行轉義,比如,為了匹配字符串 『python.org』,我們需要使用正則表達式 'python\.org',而 Python 的字符串本身也用 \ 轉義,所以上面的正則表達式在 Python 中應該寫成 'python\\.org',這會很容易陷入 \ 的困擾中,因此,我們建議使用 Python 的原始字符串,只需加一個 r 前綴
  • Python模塊學習 ---- re正則表達式
    模塊Python自帶了匹配字符串的模塊re,我們可以通過該模塊對字符串進行(模糊)匹配,提取出我們需要的內容。re模塊中很多功能都是基於正則表達式實現的。正則表達式是一種特殊的字符序列,它能幫助我們去檢查字符串是否與某種模式相匹配。常用方法1、re.compile(pattern, flags=0)將正則表達式編譯成正則對象,搭配match、search、findall等等進行匹配。
  • Python中正則表達式模塊詳解
    用來處理字符串,對字符串進行檢索和替換,另外正則在python爬蟲的應用也是相當廣泛!
  • Python3爬蟲(4)--python正則表達式詳細版
    等等,在python中,這些都可以用正則表達式處理函數進行處理。re 模塊使 Python 語言擁有全部的正則表達式功能。使用前導入該模塊:import re1、re.match()函數和re.search()函數,實現字符串的正則匹配match 和 search 只匹配一次,當正則表達式在字符串中匹配到多個結果時,在不指定全部返回的情況下,只返回最先匹配到的第一個結果。
  • Python re正則模塊
    re模塊的常用方法findall:返回所有滿足匹配條件的結果,放在列表裡,如果沒有滿足的則返回空列表import reret = re.findall('^[sd]','sdhjaskhjxc wdads') # 返回所有滿足匹配條件的結果,放在列表裡print (ret)# 結果:[s]search:函數會在字符串內以查找模式匹配
  • 原創通俗易懂的Python的正則表達式,建議收藏
    正則表達式正則表達式是一個特殊的字符序列,由普通字符和元字符組成。元字符能幫助你方便的檢查一個字符串是否與某種模式匹配。正則表達式應用的場景也非常多。常見的比如:搜尋引擎的搜索、爬蟲結果的匹配、文本數據的提取等等都會用到,所以掌握甚至精通正則表達式是一個硬性技能,非常必要。
  • Python 正則表達式
    正則表達式有多種不同的風格,下表列出了適用於 Python 或 Perl 等程式語言的部分元字符以及說明:re 模塊在 Python 中,我們可以使用內置的 re 模塊來使用正則表達式。有一點需要特別注意的是,正則表達式使用 對特殊字符進行轉義,比如,為了匹配字符串 'python.org',我們需要使用正則表達式 'python.org',而 Python 的字符串本身也用 轉義,所以上面的正則表達式在 Python 中應該寫成 'python\.org',這會很容易陷入 的困擾中,因此,我們建議使用 Python 的原始字符串,只需加一個 r 前綴,上面的正則表達式可以寫成
  • Python中的正則表達式之re.Match類
    # re.Match類的使用# 導入模塊import re# 調用re.match,re.search
  • Python正則表達式總結
    大多數程式語言的正則表達式設計都師從Perl,所以語法基本相似,不同的是每種語言都有自己的函數去支持正則,今天我們就來學習 Python中關於 正則表達式的函數。re模塊主要定義了9個常量、12個函數、1個異常,每個常量和函數豬哥都會通過實際代碼案例講解,讓大家能更直觀的了解其作用!註:為避免出現代碼格式錯亂,豬哥儘量使用代碼截圖演示哦。
  • python正則表達式使用方法說明
    曾光紅/文 (同步發布豆瓜網)一、導入re庫python使用正則表達式要導入re庫。import re在re庫中。正則表達式通常被用來檢索查找、替換那些符合某個模式(規則)的文本。二、使用正則表達式步驟1、尋找規律;2、使用正則符號表示規律;3、提取信息,如果每一個字符都能匹配,則匹配成功;一旦有匹配不成功的字符則匹配失敗。
  • Python中使用re模塊實現正則表達式的匹配字符串操作
    第八十二節:匹配字符串經過上一節比較枯燥的基礎內容,今天來看看如何利用正則表達式在Python中進行具體操作。在Python中使用正則表達式,首先要導入一個re模塊。re就是Regular Expression(正則表達式)的縮寫,所以導入re模塊就是導入「正則表達式模塊」。導入re模塊的代碼比較簡單,它是這樣的:Import re今天的學習內容就是使用正則表達式匹配字符串。
  • 【Python】一文讀懂Python正則表達式常用用法
    re 模塊在 Python 中,我們可以使用內置的 re 模塊來使用正則表達式。有一點需要特別注意的是,正則表達式使用 對特殊字符進行轉義,比如,為了匹配字符串  python.org ,我們需要使用正則表達式  python.org ,而 Python 的字符串本身也用 轉義,所以上面的正則表達式在 Python 中應該寫成  python.org ,這會很容易陷入 的困擾中,因此,我們建議使用 Python 的原始字符串,只需加一個 r 前綴,上面的正則表達式可以寫成
  • Python+RE(正則表達式)方法的簡單應用
    # 正則表達式前面HTML中已經講解了RE的表示方式,此處不再累贅。[u4e00-u9fa5] 案例28- 貪婪,非貪婪模式 - 貪婪模式:儘可能多的匹配 - 非貪婪模式:儘可能少的匹配 - python裡,默認為貪婪模式 - 例子:正則:ab* abbbbbbcccccc - 貪婪模式:abbbbbb - 非貪婪模式:a實例1.group和span方法import res =
  • Python爬蟲之正則表達式一些常用方法
    正則表達式與Python在了解了正則表達式的相關知識之後,開始查看Python當前如何通過使用re模塊來支持正則表達式,re模塊在很早之前就引入了,用於替換那些已過時的regex模塊和regsub模塊——這兩個模塊在Python2.5版中移除,而且此後導入這兩個模塊中的任意一個都會出發
  • Python正則表達式,這一篇就夠了!
    大多數程式語言的正則表達式設計都師從Perl,所以語法基本相似,不同的是每種語言都有自己的函數去支持正則,今天我們就來學習 Python中關於 正則表達式的函數。re模塊主要定義了9個常量、12個函數、1個異常,每個常量和函數豬哥都會通過實際代碼案例講解,讓大家能更直觀的了解其作用!註:為避免出現代碼格式錯亂,豬哥儘量使用代碼截圖演示哦。
  • Python正則表達式入門到入魔
    1、re模塊官方文檔(中文版)  2、Python內置模塊  3、re模塊庫原始碼  4、正則表達HOWTO  5、學習網站三、re模塊簡介四、語法原理  1、基本元字符  2、數量元字符1、re模塊官方文檔(中文版)https://docs.python.org/zh-cn/3.7/library/re.html2、Python內置模塊https://docs.python.org/3/py-modindex.html
  • 還不會正則?
    作為整個公司唯二會Python的工程師之一(也許是另一位Python大佬太優秀,搬磚的任務還得小弟親自來),爬蟲的任務當仁不讓的就落到小弟(小編本文)身上了。苦於好久沒有做過爬蟲,正則表達式的一些使用和匹配規則記得不太清楚了,於是就系統的複習了一遍。今天就藉此機會給大家分享一下正則表達式的使用。