Python3爬蟲(4)--python正則表達式詳細版

2021-02-28 數據運營與數據分析
前言正則表達式是對字符串操作的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個「規則字符串」,這個「規則字符串」用來表達對字符串的一種過濾邏輯。它能幫助你方便的檢查一個字符串是否與某種模式匹配。最常見的郵箱規則模式:[a-zA-Z0-9_-]+@[a-zA-Z0-9]+(.[a-zA-Z0-9]+),什麼意思呢?做數據清洗的時候想查出一些特定的字符,批量替換一些指定的字符怎麼做?...等等,在python中,這些都可以用正則表達式處理函數進行處理。re 模塊使 Python 語言擁有全部的正則表達式功能。使用前導入該模塊:import re1、re.match()函數和re.search()函數,實現字符串的正則匹配

match 和 search 只匹配一次,當正則表達式在字符串中匹配到多個結果時,在不指定全部返回的情況下,只返回最先匹配到的第一個結果。

re.match 嘗試從字符串的起始位置匹配一個模式,如果不是起始位置匹配成功的話,match()就返回none。函數語法:re.match(pattern, string, [flags])re.search 掃描整個字符串從任意位置匹配並返回第一個成功的匹配。函數語法:re.search(pattern, string, [flags])re.match只匹配字符串的開始,如果字符串開始不符合正則表達式,則匹配失敗,函數返回None;而re.search匹配整個字符串,直到找到一個匹配。所以實際應用往往使用re.search()函數。pattern:匹配的正則表達式(參考後面的正則表達式匹配模式附件)。flags:標誌位,用於控制正則表達式的匹配方式(參考後面的flags匹配模式模塊)group(num) / groups() :我們可以使用group(num) 或 groups() 匹配對象函數來獲取匹配表達式group(num=0):匹配的整個表達式的字符串,group() 可以一次輸入多個組號,在這種情況下它將返回一個包含那些組所對應值的元組。groups():返回一個包含所有小組字符串的元組,從 1 到 所含的小組號。re.match函數案例:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import re
line = "This is a regular expression for python"
matchObj = re.match(r'(.*) is (.*?) .*', line, re.M | re.I)
if matchObj:
    print("matchObj.span() :",matchObj.span())
    print("matchObj.group() : ", matchObj.group())
    print("matchObj.group(1) : ", matchObj.group(1))
    print("matchObj.group(2) : ", matchObj.group(2))
    print("matchObj.groups()) :", matchObj.groups())
else:
    print("No match!!")

# 結果:
# matchObj.span() : (0, 39)
# matchObj.group() :  This is a regular expression for python
# matchObj.group(1) :  This
# matchObj.group(2) :  a
# matchObj.groups()) : ('This', 'a')

re.search函數案例:
#re.search()函數,掃描整個字符串從任意位置匹配並返回第一個成功的匹配。
line = "This is a regular expression for python"
searchObj = re.search(r"a (.*) for (p.*n$)",line,re.M | re.I)
print("searchObj.span() :",searchObj.span())
print("searchObj.group() : ", searchObj.group())#重點使用
print("searchObj.group(1) : ", searchObj.group(1))
print("searchObj.groups() : ", searchObj.groups())
 
# 輸出:
# searchObj.span() : (8, 39)
# searchObj.group() :  a regular expression for python
# searchObj.group(1) :  regular expression
# searchObj.groups() :  ('regular expression', 'python')

#re.mactch()函數和re.search()函數對比
import re
line = "This is a regular expression for python"
matchObj = re.match(r"python",line,re.M | re.I)
if matchObj:
    print(matchObj.group())
else:
    print("No match!!")
searchObj = re.search(r"python",line,re.M | re.I)
if searchObj:
    print(searchObj.group()) 
else:
    print("No search!!")
 
# 輸出:
# No match!!
# python

2、re.sub()函數,用於 檢索和替換

Python 的 re 模塊提供了re.sub用於替換字符串中的匹配項。

語法:re.sub(pattern, repl, string, [count=0], [flags=0])count : 模式匹配後替換的最大次數,默認 0 表示替換所有的匹配。flags:標誌位,用於控制正則表達式的匹配方式,默認flags=0表示不進行特殊指定(參考後面的flags匹配模式模塊)
#re.sub()函數 檢索和替換
import re
line = "112-568-774"  # 結果:==> 112568774
subObj = re.sub(r"\D","",line, count=0, flags=0)
print(subObj)
 
#repl 參數是一個函數.將匹配的數字乘以 2
line= 'A23G4HFD567'  # 結果:==> A46G8HFD1134
def double(x):
    x = int(x.group('value'))*2
    return str(x)
print(re.sub('(?P<value>\d+)',double,line))
# ?P<value>的意思就是命名一個名字為value的組,匹配規則符合後面的/d+

3、re.compile() 函數,生成一個正則表達式( Pattern )對象

compile 函數用於編譯正則表達式,生成一個正則表達式( Pattern )對象,供 match() 、search() 、sub()、findall()、finditer()、split()等函數使用。

pattern = re.compile(pattern[, flags])m = pattern.match()/pattern.search()/.... #函數參數與re.match()/re.search()/... 對比少寫一個pattern參數即可,其他不變flags : 可選,表示匹配模式,比如忽略大小寫,多行模式等4、re.compile() 供 match() 和 search() 這兩個函數的使用
string = "字符串"
pattern = re.compile(pattern [,flags])
m1 = pattern.match(string [, pos[, endpos]]) 
m2 = pattern.seach(string [, pos[, endpos]])
result = m1.group()
result = m2.group()

pos : 可選參數,指定字符串的起始位置,默認為0。endpos : 可選參數,指定字符串的結束位置,默認為字符串的長度。
#編輯器:ipython
In [1]: import re
In [2]: pattern = re.compile(r"\d")
In [3]: m = pattern.match("abc123def456") #查找頭部是否有數字
In [4]: print(m)
None
In [5]: m1 = pattern.search("abc123edf456")#查詢字符串中的數字
In [6]: print(m1)
<re.Match object; span=(3, 4), match='1'>
In [7]: m2 = pattern.match("abc123456dfe",3,8) #指定起止位置的查找
In [8]: print(m2)
<re.Match object; span=(3, 4), match='1'>
In [9]: m3 = pattern.search("asd123456789gh",3,8) #指定起止位置的查找
In [10]: print(m3)
<re.Match object; span=(3, 4), match='1'>
In [11]: print(m3.group()) #返回結果
1
In [12]: #返回多值的正則表達式
In [13]: pattern = re.compile(r"\d+")
In [14]: m = pattern.search("asd123456789gh",3,8) #指定起止位置的查找
In [15]: print(m.group())
12345
In [16]: print(m.start(),m.end(),m.span())
3 8 (3, 8)

5、findall()使用,匹配的所有子串,列表返回

在字符串中找到正則表達式所匹配的所有子串,並返回一個列表,如果沒有找到匹配的,則返回空列表。

注意:match 和 search 是匹配一次,使用group()調用結果, findall 匹配所有,返回結果列表。

pattern = re.compile(pattern [,flags])result = pattern.findall(string[, pos[, endpos]])result = re.findall(pattern,string[, pos[, endpos]])pos : 可選參數,指定字符串的起始位置,默認為 0。endpos : 可選參數,指定字符串的結束位置,默認為字符串的長度。
import re
#re.compile() 供findall(string[, pos[, endpos]])使用
s = "a12b12c12d12"
parttern = re.compile(r"\d+")
result1 = parttern.findall(s)
print(result1)  # ['12', '12', '12', '12']
result2 = parttern.findall(s,0,5)
print(result2) # ['12', '1']
 
#單獨使用indall(string[, pos[, endpos]])
result3 = re.findall(r"\d+","20a20b20-20.20c2")
print(result3) #['20', '20', '20', '20', '20', '2']

6、re.finditer()使用,匹配的所有子串,迭代器返回

與 findall 類似,在字符串中找到正則表達式所匹配的所有子串,並把它們作為一個迭代器返回。

pattern = re.compile(pattern [,flags])m = re.finditer(pattern, string, flags=0)m = pattern.finditer(string[, flags=0])pattern:匹配的正則表達式(參考後面的正則表達式匹配模式附件)。flags:標誌位,用於控制正則表達式的匹配方式(參考後面的flags匹配模式模塊)
import re
pattern = re.compile(r"\d+")
it = pattern.finditer("12a32bc43jf3")
s = []
for i in it:
    s.append(i.group()) #將結果轉化為列表
print(s)  #['12', '32', '43', '3']

7、re.split()使用,將字符串分割後返回列表

split 方法按照能夠匹配的子串將字符串分割後返回列表,

re.split(pattern, string[, maxsplit=0, flags=0])maxsplit:分隔次數,maxsplit=1 分隔一次,默認為 0,不限制次數。
import re
s ="廣東-廣州-天河-2021-01-16"
pattern = re.compile(r"-")
s1 = pattern.split(s,maxsplit=3)
print(s1)  #['廣東', '廣州', '天河', '2021-01-16']

8、'(?P...)' 分組匹配
import re
s = '4225281994xxxxxxxx'
res = re.search('(?P<province>\d{3})(?P<city>\d{3})(?P<born_year>\d{4})',s)
print(res.groupdict()) 
#{'province': '422', 'city': '528', 'born_year': '1994'}

附件1、flags匹配模式規則表修飾符flags描述re.I忽略大小寫re.L表示特殊字符集 \w, \W, \b, \B, \s, \S  依賴於當前環境re.M多行模式re.S即為 . 並且包括換行符在內的任意字符(. 不包括換行符)re.U表示特殊字符集 \w, \W, \b, \B, \d, \D, \s,  \S
依賴於 Unicode 字符屬性資料庫re.X了增加可讀性,忽略空格和 # 後面的注釋0flags=0表示不進行特殊指定附件2、pattern正則表達式匹配模式規則表模式pattern描述說明^匹配字符串的開頭$匹配字符串末尾.匹配任意字符,除了換行符[可以用flag=re.S解決換行][...]用來表示一組字符,單獨列出:[jxr12] 表示匹配  'j'或'x'或'r'或1或2,[0-9]<=>[0123456789],[A-Z]表示任意大寫字母,[a-z]表示所有小寫字母[^...]不在[]內的其他字符,如:[^abc]匹配除abc的其他字符re*0個或者多個表達式re+1個或者多個表達式re?匹配0個或者1個由前面的正則式定義的片段,非貪婪方式。.*.* 代表匹配除換行符之外的所有字符。.*?.*? 後面多個問號,代表非貪婪模式,也就是說只匹配符合條件的最少字符re{n}精確匹配 n 個前面表達式。例如, o{2} 不能匹配  "Bob" 中的 "o",但是能匹配 "food" 中的兩個 o。re{n,}匹配 n 個前面表達式。例如, o{2,}  不能匹配"Bob"中的"o",但能匹配 "foooood"中的所有  o。"o{1,}" 等價於 "o+"。"o{0,}" 則等價於 "o*"  。re{n,m}匹配 n 到 m 次由前面的正則表達式定義的片段,貪婪方式x| y匹配x或者y(re)匹配括號內的表達式,也表示一個組(?imx)正則表達式包含三種可選標誌:i, m, 或 x 。只影響括號中的區域  。 (?-imx)正則表達式關閉 i, m, 或 x 可選標誌。只影響括號中的區域。(?: re)類似 (...), 但是不表示一個組(?imx: re)在括號中使用i, m, 或 x 可選標誌(?-imx: re)在括號中不使用i, m, 或 x 可選標誌(?#...)注釋.(?= re)前向肯定界定符。如果所含正則表達式,以 ...  表示,在當前位置成功匹配時成功,否則失敗。但一旦所含表達式已經嘗試,匹配引擎根本沒有提高;模式的剩餘部分還要嘗試界定符的右邊。(?! re)前向否定界定符。與肯定界定符相反;當所含表達式不能在字符串當前位置匹配時成功(?> re)匹配的獨立模式,省去回溯。\w匹配字母數字及下劃線\W匹配非字母數字及下劃線\s匹配任意空白字符,等價於 [\t\n\r\f].\S匹配任意非空字符\d匹配任意數字,等價於 [0-9].\D匹配任意非數字\A匹配字符串開始\Z匹配字符串結束,如果是存在換行,只匹配到換行前的結束字符串。\z匹配字符串結束\G匹配最後匹配完成的位置。\b匹配一個單詞邊界,也就是指單詞和空格間的位置。例如, 'er\b'  可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。\B匹配非單詞邊界。'er\B' 能匹配 "verb"  中的 'er',但不能匹配 "never" 中的 'er'。\n, \t, 等.匹配一個換行符。匹配一個制表符。等\1...\9匹配第n個分組的內容。\10匹配第n個分組的內容,如果它經匹配。否則指的是八進位字符碼的表達式。\轉義字符。如:\. 、\?、\*  轉義為本身的意思

最後理解一下:[a-zA-Z0-9_-]+@[a-zA-Z0-9]+(.[a-zA-Z0-9]+)

表示a到z或A到Z或0到9任意1個或多個@a到z或A到Z或0到9任意1個或多個.a到z或A到Z或0到9任意1個或多個。即:xx···x@xx···x.xx···x,如:189xxxx7478@qq.com

相關焦點

  • 妙用正則表達式--Python中的re模塊
    目前正在火熱招生中~詳細培訓大綱及報名方式,請點擊文末閱讀原文呦~另外,2019年11月29日-12月1日,武漢字符串數據科技有限公司將在湖北武漢舉辦《第四期Python編程技術培訓》的招生即將結束,還有少量名額,感興趣的同學可打開爬蟲俱樂部往期推文——《2019年Python第四期培訓招生
  • Python之re模塊方法詳解(正則表達式)
    學習re模塊首先要對python正則表達式要了解,正則表達式是一個特殊的字符序列,它能幫助你方便的檢查一個字符串是否與某種模式匹配
  • 原創通俗易懂的Python的正則表達式,建議收藏
    正則表達式正則表達式是一個特殊的字符序列,由普通字符和元字符組成。元字符能幫助你方便的檢查一個字符串是否與某種模式匹配。正則表達式應用的場景也非常多。常見的比如:搜尋引擎的搜索、爬蟲結果的匹配、文本數據的提取等等都會用到,所以掌握甚至精通正則表達式是一個硬性技能,非常必要。
  • Python中爬蟲框架或模塊的區別
    Python中爬蟲框架或模塊的區別 (1)爬蟲框架或模塊 Python自帶爬蟲模塊:urllib、urllib2 ; 第三方爬蟲模塊:requests,aiohttp;
  • Python正則表達式總結
    正則表達式 的起源、發展、流派、語法、引擎、優化等相關知識,今天我們主要來學習一下 正則表達式在 Python語言 中的應用!可以在這裡查看Python所有的內置模塊:https://docs.python.org/3/py-modindex.html#cap-r因為re是內置模塊,所以不需要再下載,使用時直接引入即可:re模塊官方文檔:https://docs.python.org/zh-cn/3.8/library/re.htmlre模塊庫源碼:https://github.com/python/cpython/blob
  • Python爬蟲提取神器,正則表達式(re模塊),全程乾貨!
    python正則表達式(re模塊)什麼是正則表達式正則表達式(Regular Expression)是一種文本模式,包括普通字符(例如,a到z之間的字母
  • Python 正則表達式
    最簡單的正則表達式就是普通字符串,可以匹配其自身。比如,正則表達式 『hello』 可以匹配字符串 『hello』。要注意的是,正則表達式並不是一個程序,而是用於處理字符串的一種模式,如果你想用它來處理字符串,就必須使用支持正則表達式的工具,比如 Linux 中的 awk, sed, grep,或者程式語言 Perl, Python, Java 等等。
  • Python中正則表達式模塊詳解
    用來處理字符串,對字符串進行檢索和替換,另外正則在python爬蟲的應用也是相當廣泛!
  • 5分鐘完全掌握正則表達式
    </h1>', html)print(content)#result [' test1 ', ' test2 ', ' test3 ']那正則表達式到底是什麼,又該如何使用,為什麼我們爬蟲中老是使用(.*?),它到底起到了什麼作用,這篇文章就詳細告訴你。
  • python正則表達式
    微信公眾號:學點啥玩點啥小白友好型python正則表達式 1#第7章 模式匹配與正則表達式
  • python re庫的正則表達式學習筆記
    安裝默認已經安裝好了python環境了re庫是python3的核心庫,不需要pip install,直接import就行2.通配符在正則表達式中,有些字符是有特殊意義的(不是轉義字符的那套規則),下面介紹常用的通配符字符1)"."
  • Python網絡爬蟲之正則表達式(一)
    這就要用到一個十分強大的工具:正則表達式。1 初識正則表達式正則表達式是對字符串操作的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個「規則字符串」,這個「規則字符串」用來表達對字符串的一種過濾邏輯。正則表達式並不是Python的一部分。
  • Python網絡爬蟲之正則表達式(二)
    1 re模塊Python通過re模塊提供對正則表達式的支持,使用re的一般步驟是先將正則表達式的字符串形式編譯為Pattern實例,然後使用Pattern實例處理文本並獲得匹配結果(一個Match實例),最後使用Match實例獲得信息,進行其他的操作。
  • python爬蟲入門實戰!爬取博客文章標題和連結!
    而爬蟲只要寫腳本,執行,泡杯咖啡,坐等他執行完。首先需要在電腦上裝好 python3 和 pip 。此外還需要知道python的一些基本語法。這些內容網上搜索有許多教程(例如廖雪峰),這邊就不再細說了。我們這次需要使用的是 正則表達式 re 庫和第三方的 requests 庫,以下是安裝方法。
  • Python正則表達式,這一篇就夠了!
    可以在這裡查看Python所有的內置模塊:https://docs.python.org/3/py-modindex.html#cap-r因為re是內置模塊,所以不需要再下載,使用時直接引入即可:re模塊官方文檔:https://docs.python.org/zh-cn/3.8/library/re.htmlre模塊庫源碼:https://github.com/python/cpython/blob
  • 萬字長文詳解Python正則表達式及re模塊
    exp) 零寬度負回顧後發斷言,來斷言此位置的前面不能匹配表達式exp,Python中提供的re模塊使Python擁有全部正則表達式的功能!語法格式如下:re.match(pattern, string, flags=0)pattern是匹配的正則表達式,string是要匹配的字符串。flags是標誌位,用於控制正則表達式的匹配方式,如:是否區分大小寫,多行匹配等等。
  • Python爬蟲之正則表達式一些常用方法
    正則表達式與Python在了解了正則表達式的相關知識之後,開始查看Python當前如何通過使用re模塊來支持正則表達式,re模塊在很早之前就引入了,用於替換那些已過時的regex模塊和regsub模塊——這兩個模塊在Python2.5版中移除,而且此後導入這兩個模塊中的任意一個都會出發
  • 學習Python正則表達式
    Python中的正則表達式(re)就可以解決這個問題!正則表達式正則表達式是一個具有特殊字符的序列。它有助於檢查字符串中的每個字符,看它是否與某個模式匹配:哪些字符在什麼位置出現了多少次。result = re.findall(r』\d』, text)這將返回所有數字,但每個元素只有一個數字:['1', '0', '0', '1', '1', '1', '1', '2', '3', '4', '5', '6', '7']r-python原始字符串這裡,r表示python原始字符串。
  • Python正則表達式入門到入魔
    4、20世紀80年代Perl語言誕生了,它綜合了其他的語言,用正則表達式作為基礎,開創了一個新的流派,Perl流派。之後很多程式語言如:Python、Java、Ruby、.Net、PHP等等在設計正則式支持的時候都參考Perl正則表達式。
  • Python正則表達式:特殊符號和字符
    正表達式為高級的文本模式匹配,抽取,與/或文本形式的搜索和替換功能提供了基礎。簡而言之,正則表達式(簡稱regex)是由一些字符和特殊符號組成的字符串,它描述了模式的重複或者表達多個字符。python通過標準庫中的re模塊來支持正則表達式。