python爬蟲學習第五章正則

來源:互聯網
上載者:User

標籤:pattern   top   ddd   processor   重複   canvas   大小寫   lag   mat   

Regex與Cookie的使用Regex基礎知識
  1. 原子
    原子是Regex中最基本的組成單位,每個Regex中至少要包含一個原子,常見的原子有以下幾類:
    • 一般字元作為原子
    • 非列印字元作為原子
    • 通用字元作為原子
    • 院子表
    • 一般字元作原子的情況。一般字元比如數字、大小寫字母、底線等都可以作為原子使用。比如如下程式中,我們就使用了“yue"作為原子使用,分別是‘y‘‘u‘‘e‘。import re
      pattern="yue"
      string="http://yum.iqianyue.com"
      result1=re.search(pattern,string)
      print(result1)
    • 非列印字元作為原子
      所謂的非列印字元,指的是一些在字串中用于格式控制的符號,比如分行符號等。import re
      pattern="\n"
      string="http://yum.iqianyue.com
      http://baidu.com"
      result1=re.search(pattern.string)
      print(result1)
    • 通用字元作為原子
      所謂通用字元,即一個原子可以匹配一類字元,我們在實際項目中經常會用到這一類原子。
      | 符號 | 含義|| \w | 匹配任意一個字母、數字或底線 |
      | \W | 匹配除了字母、數字和底線以外的任一字元|
      | \d | 匹配任意一個十進位數|
      | \D | 匹配除了十進位數以外的任意一個其他字元 |
      | \s | 匹配任意一個空白字元 |
      | \S | 匹配除空白字元以外的任意一個其他字元 | import re
      pattern="\w\dpython\w"
      string="abcdfphp345python_py"
      result1=re.search(pattern,string)
      print(result1)
    • 原子表
      定義一組地位平等的原子,然後匹配的時候會取該原子表中的任意一個原子匹配,在Python中,原子表有[]表示比如[xyz]就是一個原子表,這個原子表中定義了3個原子,這3個原子的地位平等,如,我們定義的Regex為“[xyz]py”,對應的原字串是"xpython",如果此時使用re.search()函數進行匹配,就可以匹配出結果"xpy",因為此時只要py前一位是x y z字母中的其中一個字母,就可以匹配成功。
      類似的,[^]代表的是除了中括弧裡面的原子均可以匹配,比如"[^xyz]py"能匹配"apy",但是卻不能匹配"xpy"等。
      import re
      pattern1="\w\dpython[xyz]\w"
      pattern2="\w\dpython[^xyz]\w"
      pattern3="\w\dpython[xyz]\W"
      string="abcdfphp345pythony_py"
      result1=re.search(pattern1,string)
      result2=re.search(pattern2,string)
      result3=re.search(pattern3,string)
      print(result1)
      print(result2)
      print(result3)
  2. 元字元
    所謂元字元,就是Regex中具有一些特殊含義的字元,比如重複N次前面的字元等。 | 符號 | 含義 |
    | . | 匹配除分行符號以外的任一字元 |
    | ^ | 匹配字串的開始位置 |
    | $ | 匹配字串的結束位置 |
    | * | 匹配0次、1次或多次前面的原子 |
    | ? | 匹配0次或1次前面的院子 |
    | + | 匹配1次或多次前面的原子 |
    | {n} | 前面的院子恰好出現n次 |
    | {n,} | 前面的原子至少出現n次 |
    | {n,m} | 前面的原子至少出現n次,至多出現m次 |
    | ‘|‘ | 模式選擇符 |
    | () | 模式單元符 |
    具體來說元字元可以分為:任意匹配元字元、邊界限制元字元、限定符、模式選擇符、模式單元等。 <<<<<<< HEAD
    • 任意匹配元字元
      首先講解任意匹配元字元 “.”,我們可以使用"."匹配一個除分行符號以外的任一字元。比如,我們可以使用Regex".python..."匹配一個"python"字元前1位,後面有3位的格式的字元,這裡的前一位和後面的3位可以是除了分行符號以外的任一字元。import re pattern=".python..."string="abcdfphp345pythony_py"result1=re.search(pattern,string)print(result1)
    • 邊界限制元字元
      可以使用"^"匹配字串的開始,使用"$"匹配字串的結束import re
      pattern1="^abd"
      pattern2="^abc"
      pattern3="py$"
      pattern4="ay$"
      string="abcdfphp345pythony_py"
      result1=re.search(pattern1,string)
      result2=re.search(pattern2,string)
      result3=re.search(pattern3,string)
      result4=re.search(pattern4,string)
      print(result1)
      print(result2)
      print(result3)
      print(result4)
    • 限定符
      常見的限定符包括*、?、+、{n}、{n,}、{n,m}.
      import re
      pattern1="py.*n"
      pattern2="cd{2}"
      pattern3="cd{3}"
      pattern4="cd{2,}"
      string="abcdddfphp345pythony_py"
      result1=re.search(pattern1,string)
      result2=re.search(pattern2,string)
      result3=re.search(pattern3,string)
      result4=re.search(pattern4,string)
      print(result1)
      print(result2)
      print(result3)
      print(result4)
    • 模式選擇符
      模式選擇符“|”,可以設定多個模式,匹配時,可以從中選擇任意一個模式比對。比如Regex“python|php”中,字串“python”和"php"均滿足匹配條件。import re
      pattern="python|php"
      string="abcdfphp345pythony_py"
      result1=re.search(pattern,string)
      print(result1)
    • 模式單元符
      模式單元符"()",可以將一些原子組合成一個大原子,小括弧括起來的部分作為一個整體去使用。 import re
      pattern1="(cd){1,}"
      pattern2="cd{1,}"
      string="abcdcdcdcdfphp345pythony_py"
      result1=re.search(pattern1,string)
      result2=re.search(pattern2,string)
      print(result1)
      print(result2)
  3. 模式修正
    所謂模式修正符,即可以在不改變Regex的情況下,通過模式修正符改變Regex的含義,從而實現一些匹配結果的調整等功能。比如,可以使用模式修正符I讓對於模組在匹配時不區分大小寫。
    | 符號 | 含義 || I | 匹配時忽略大小寫 |
    | M | 多行匹配 |
    | L | 做本地化識別匹配 |
    | U | 根據Unicode字元及解析字元 |
    | S | 讓.匹配包括分行符號,即用了該模組修正後,"."匹配就可以匹配任意的字元了|
    import re
    pattern1="python"
    pattern2="python"
    string="abcdfphp34Pythony_py"
    result1=re.search(pattern1,string)
    result2=re.search(pattern2,string,re.I)
    print(result1)
    print(result2)
  4. 貪婪模式與懶惰模式
    貪婪模式的核心點就是儘可能多地匹配,而懶惰模式的核心點就是儘可能少的匹配。
    import re
    pattern1="p.*y"#貪婪模式
    pattern2="p.*?y"#懶惰模式
    string="abcdfphp345pythony_py"
    result1=re.search(pattern1,string)
    result2=re.search(pattern2,string)
    print(result1)
    print(result2)
Regex常見函數
  1. re.match()函數
    如果想要從起始位置匹配一個模式,可以使用re.match()函數,格式
    re.match(pattern,string,flag)
    第一個參數為Regex,第二個參數源字串,第三個是選擇性參數,代表標誌位。
    import re
    string="apythonhellomypythonhispythonourpythonend"
    pattern=".python."
    result=re.match(pattern,string)
    result2=re.match(pattern,string).span()
    print(result)
    print(result2)
  2. re.search()函數
    re.search()函數會在全文中進行檢索並匹配.
    import re
    string="hellomypythonhispythonourpythonend"
    pattern=".python."
    result=re.match(pattern,string)
    result2=re.search(pattern,string)
    print(result)
    print(result2)
  3. 全域匹配函數
    匹配一串字串中多個結果。
    • 使用re.compile()對Regex進行先行編譯.
    • 編譯後,使用findall()根據Regex從源字串中將匹配的結果全部找出。 、import re
      string="hellomypythonhispythonourpythonend"
      pattern=re.compile(".python.")#先行編譯
      result=pattern.findall(string)#找出符合模式的所有結果
      print(result)

      import re
      string="hellomypythonhistpythonourpythonend"
      pattern=".python."
      result=re.compile(pattern).findall(string)
      print(result)
  4. re.sub函數
    使用Regex替換某些字串功能,可以使用re.sub()函數實現。
    re.sub(pattern,rep,string,max)
    第一個參數為Regex,第二個參數為要替換成的字串,第三個參數為源字串,第四個參數為可選項,代表最多替換的次數,不寫的話,就全部替換。
    import re
    string="hellomypytonhispythonourpythonend"
    pattern="python."
    result1=re.sub(pattern,"php",string)#全部替換
    result2=re.sub(pattern,"php",string,2)#最多替換兩次
    print(result1)
    print(result2)
常見執行個體解析
  • 匹配.com或.cn尾碼的URL網址
    import re
    pattern="[a-zA-Z]+://[^\s]*[.com|.cn]"
    string="<a href=‘http://www.baidu.com‘>百度首頁</a>"
    result=re.search(pattern,string)
    print(result)
  • 匹配電話號碼
    import re
    pattern="\d{4}-\d{7}|\d{3}-\d{8}"匹配電話號碼的Regex
    string="0216728263682382265236"
    result=re.search(pattern,string)
    print(result)
  • 匹配電子郵件地址
    import re
    pattern="\w+([.+-]\w+)*@\w+([.-]\w+)*\.\w+([.-]\w+)*"#匹配電子郵箱的Regex
    string="<a href=‘http://www.baidu.com‘>百度首頁</a><br><a href=‘mailto:[email protected]‘>電子郵箱地址</a>"
    result=re.search(pattern,string)
    print(result)
什麼是Cookie

Http是一個無狀態協議,即無法維持會話之間的狀態。Cookie可以儲存狀態。

Cookiejar實戰

import urllib.request
import urllib.parse
import http.cookiejar
url="post請求地址"
postdata=urllib.parse.urlencode({
"username":"使用者名稱"
"password":"密碼"
}).encode("utf-8")
req=urllib.request.Request(url,postdata)
req.add_header(‘User-Agent‘,‘User-Agent的值‘)
cjar=http.cookieJar.CookieJar() #使用http.cookiejar.CookieJar()建立CookieJar對象
opener=urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cjar))#使用HTTPCookieProcessor建立cookie處理器,並以其為參數構建opener對象
urllib.request.install_opener(opener) #將opener安裝為全域
file=opener.open(req)
data=file.read()
file=open("檔案儲存體地址","wb")
file.write(data)
file.close()
url2="網頁地址"
data2=urllib.request.urlopen(url2).read()
fh=open("檔案地址",‘wb‘)
fh.write(data2)
fh.close()

=======

3f577ee4216aa3d991983f31467a7d7578dd9797

python爬蟲學習第五章正則

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.