python之正則表示式以及網路爬蟲
正則表示式 (Regular Expression) 又稱 RegEx, 是用來匹配字元的一種工具. 在一大串字元中尋找你需要的內容. 它常被用在很多方面, 比如網頁爬蟲, 文稿整理, 資料篩選等等. 最簡單的一個例子, 比如我需要爬取網頁中每一頁的標題. 而網頁中的標題常常是這種形式.
<title>我是標題</ title>
而且每個網頁的標題各不相同, 我就能使用正則表示式, 用一種簡單的匹配方法, 一次性選取出成千上萬網頁的標題資訊. 正則表示式絕對不是一天就能學會和記住的, 因為表示式裡面的內容非常多, 強烈建議, 現在這個階段, 你只需要瞭解正則裡都有些什麼, 不用記住, 等到你真正需要用到它的時候, 再反過頭來, 好好琢磨琢磨, 那個時候才是你需要訓練自己記住這些表示式的時候.
簡單的匹配
正則表示式無非就是在做這麼一回事. 在文字中找到特定的內容, 比如下面的內容. 我們在 “dog runs to cat” 這句話中尋找是否存在 “cat” 或者 “bird”.
# matching string
pattern1 = "cat"
pattern2 = "bird"
string = "dog runs to cat"
print(pattern1 in string) # True
print(pattern2 in string) # False
但是正則表示式絕非不止這樣簡單的匹配, 它還能做更加高階的內容. 要使用正則表示式, 首先需要呼叫一個 python 的內建模組 re
re.search()
找到了結果, 它會返回一個
match 的 object. 如果沒有匹配到, 它會返回 None. 這個 re.search()
只是 re
中的一個功能,
之後會介紹其它的功能.
import re
# regular expression
pattern1 = "cat"
pattern2 = "bird"
string = "dog runs to cat"
print(re.search(pattern1, string)) # <_sre.SRE_Match object; span=(12, 15), match='cat'>
print(re.search(pattern2, string)) # None
靈活匹配
除了上面的簡單匹配, 下面的內容才是正則的核心內容, 使用特殊的 pattern 來靈活匹配需要找的文字.
如果需要找到潛在的多個可能性文字, 我們可以使用 []
將可能的字元囊括進來. 比如 [ab]
就說明我想要找的字元可以是 a
也可以是 b
.
這裡我們還需要注意的是, 建立一個正則的規則, 我們在 pattern 的 “” 前面需要加上一個 r
用來表示這是正則表示式,
而不是普通字串. 通過下面這種形式, 如果字串中出現 “run” 或者是 “ran”, 它都能找到.
# multiple patterns ("run" or "ran")
ptn = r"r[au]n" # start with "r" means regular expression
print(re.search(ptn, "dog runs to cat")) # <_sre.SRE_Match object; span=(4, 7), match='run'>
同樣, 中括號 []
中還可以是以下這些或者是這些的組合. 比如 [A-Z]
表示的就是所有大寫的英文字母. [0-9a-z]
表示可以是數字也可以是任何小寫字母.
print(re.search(r"r[A-Z]n", "dog runs to cat")) # None
print(re.search(r"r[a-z]n", "dog runs to cat")) # <_sre.SRE_Match object; span=(4, 7), match='run'>
print(re.search(r"r[0-9]n", "dog r2ns to cat")) # <_sre.SRE_Match object; span=(4, 7), match='r2n'>
print(re.search(r"r[0-9a-z]n", "dog runs to cat")) # <_sre.SRE_Match object; span=(4, 7), match='run'>
按型別匹配
除了自己定義規則, 還有很多匹配的規則時提前就給你定義好了的. 下面有一些特殊的匹配型別給大家先總結一下, 然後再上一些例子.
- \d : 任何數字
- \D : 不是數字
- \s : 任何 white space, 如 [\t\n\r\f\v]
- \S : 不是 white space
- \w : 任何大小寫字母, 數字和 “” [a-zA-Z0-9]
- \W : 不是 \w
- \b : 空白字元 (只在某個字的開頭或結尾)
- \B : 空白字元 (不在某個字的開頭或結尾)
- \\ : 匹配 \
- . : 匹配任何字元 (除了 \n)
- ^ : 匹配開頭
- $ : 匹配結尾
- ? : 前面的字元可有可無
下面就是具體的舉例說明啦.
# \d : decimal digit
print(re.search(r"r\dn", "run r4n")) # <_sre.SRE_Match object; span=(4, 7), match='r4n'>
# \D : any non-decimal digit
print(re.search(r"r\Dn", "run r4n")) # <_sre.SRE_Match object; span=(0, 3), match='run'>
# \s : any white space [\t\n\r\f\v]
print(re.search(r"r\sn", "r\nn r4n")) # <_sre.SRE_Match object; span=(0, 3), match='r\nn'>
# \S : opposite to \s, any non-white space
print(re.search(r"r\Sn", "r\nn r4n")) # <_sre.SRE_Match object; span=(4, 7), match='r4n'>
# \w : [a-zA-Z0-9_]
print(re.search(r"r\wn", "r\nn r4n")) # <_sre.SRE_Match object; span=(4, 7), match='r4n'>
# \W : opposite to \w
print(re.search(r"r\Wn", "r\nn r4n")) # <_sre.SRE_Match object; span=(0, 3), match='r\nn'>
# \b : empty string (only at the start or end of the word)
print(re.search(r"\bruns\b", "dog runs to cat")) # <_sre.SRE_Match object; span=(4, 8), match='runs'>
# \B : empty string (but not at the start or end of a word)
print(re.search(r"\B runs \B", "dog runs to cat")) # <_sre.SRE_Match object; span=(8, 14), match=' runs '>
# \\ : match \
print(re.search(r"runs\\", "runs\ to me")) # <_sre.SRE_Match object; span=(0, 5), match='runs\\'>
# . : match anything (except \n)
print(re.search(r"r.n", "r[ns to me")) # <_sre.SRE_Match object; span=(0, 3), match='r[n'>
# ^ : match line beginning
print(re.search(r"^dog", "dog runs to cat")) # <_sre.SRE_Match object; span=(0, 3), match='dog'>
# $ : match line ending
print(re.search(r"cat$", "dog runs to cat")) # <_sre.SRE_Match object; span=(12, 15), match='cat'>
# ? : may or may not occur
print(re.search(r"Mon(day)?", "Monday")) # <_sre.SRE_Match object; span=(0, 6), match='Monday'>
print(re.search(r"Mon(day)?", "Mon")) # <_sre.SRE_Match object; span=(0, 3), match='Mon'>
如果一個字串有很多行, 我們想使用 ^
形式來匹配行開頭的字元, 如果用通常的形式是不成功的. 比如下面的
“I” 出現在第二行開頭, 但是使用 r"^I"
卻匹配不到第二行, 這時候, 我們要使用 另外一個引數,
讓 re.search()
可以對每一行單獨處理. 這個引數就是 flags=re.M
,
或者這樣寫也行 flags=re.MULTILINE
.
string = """
dog runs to cat.
I run to dog.
"""
print(re.search(r"^I", string)) # None
print(re.search(r"^I", string, flags=re.M)) # <_sre.SRE_Match object; span=(18, 19), match='I'>
重複匹配
如果我們想讓某個規律被重複使用, 在正則裡面也是可以實現的, 而且實現的方式還有很多. 具體可以分為這三種:
*
: 重複零次或多次+
: 重複一次或多次{n, m}
: 重複 n 至 m 次{n}
: 重複 n 次
舉例如下:
# * : occur 0 or more times
print(re.search(r"ab*", "a")) # <_sre.SRE_Match object; span=(0, 1), match='a'>
print(re.search(r"ab*", "abbbbb")) # <_sre.SRE_Match object; span=(0, 6), match='abbbbb'>
# + : occur 1 or more times
print(re.search(r"ab+", "a")) # None
print(re.search(r"ab+", "abbbbb")) # <_sre.SRE_Match object; span=(0, 6), match='abbbbb'>
# {n, m} : occur n to m times
print(re.search(r"ab{2,10}", "a")) # None
print(re.search(r"ab{2,10}", "abbbbb")) # <_sre.SRE_Match object; span=(0, 6), match='abbbbb'>
分組
我們甚至可以為找到的內容分組, 使用 ()
能輕鬆實現這件事. 通過分組, 我們能輕鬆定位所找到的內容. 比如在這個 (\d+)
組裡,
需要找到的是一些數字, 在 (.+)
這個組裡, 我們會找到 “Date: “ 後面的所有內容. 當使用 match.group()
時,
他會返回所有組裡的內容, 而如果給 .group(2)
里加一個數, 它就能定位你需要返回哪個組裡的資訊.
match = re.search(r"(\d+), Date: (.+)", "ID: 021523, Date: Feb/12/2017")
print(match.group()) # 021523, Date: Feb/12/2017
print(match.group(1)) # 021523
print(match.group(2)) # Date: Feb/12/2017
有時候, 組會很多, 光用數字可能比較難找到自己想要的組, 這時候, 如果有一個名字當做索引, 會是一件很容易的事. 我們字需要在括號的開頭寫上這樣的形式 ?P<名字>
就給這個組定義了一個名字.
然後就能用這個名字找到這個組的內容.
match = re.search(r"(?P<id>\d+), Date: (?P<date>.+)", "ID: 021523, Date: Feb/12/2017")
print(match.group('id')) # 021523
print(match.group('date')) # Date: Feb/12/2017
findall
前面我們說的都是隻找到了最開始匹配上的一項而已, 如果需要找到全部的匹配項, 我們可以使用 findall
功能.
然後返回一個列表. 注意下面還有一個新的知識點, |
是 or 的意思, 要不是前者要不是後者.
# findall
print(re.findall(r"r[ua]n", "run ran ren")) # ['run', 'ran']
# | : or
print(re.findall(r"(run|ran)", "run ran ren")) # ['run', 'ran']
replace
我們還能通過正則表示式匹配上一些形式的字串然後再替代掉這些字串. 使用這種匹配 re.sub()
, 將會比
python 自帶的 string.replace()
要靈活多變.
print(re.sub(r"r[au]ns", "catches", "dog runs to cat")) # dog catches to cat
split
再來我們 Python 中有個字串的分割功能, 比如想獲取一句話中所有的單詞. 比如 "a is b".split(" ")
,
這樣它就會產生一個列表來儲存所有單詞. 但是在正則中, 這種普通的分割也可以做的淋漓精緻.
print(re.split(r"[,;\.]", "a;b,c.d;e")) # ['a', 'b', 'c', 'd', 'e']
compile
最後, 我們還能使用 compile 過後的正則, 來對這個正則重複使用. 先將正則 compile 進一個變數, 比如 compiled_re
,
然後直接使用這個 compiled_re
來搜尋.
compiled_re = re.compile(r"r[ua]n")
print(compiled_re.search("dog ran to cat")) # <_sre.SRE_Match object; span=(4, 7), match='ran'>
小抄
為了大家方便記憶, 我很久以前在網上找到了一份小抄, 這個小抄的原出處應該是這裡. 小抄很有用, 不記得的時候回頭方便看.
相關推薦
python之正則表示式以及網路爬蟲
正則表示式 (Regular Expression) 又稱 RegEx, 是用來匹配字元的一種工具. 在一大串字元中尋找你需要的內容. 它常被用在很多方面, 比如網頁爬蟲, 文稿整理, 資料篩選等等. 最簡單的一個例子, 比如我需要爬取網頁中每一頁的標題. 而網頁中的標題常常是這種形式. <ti
【轉】Python之正則表示式(re模組)
【轉】Python之正則表示式(re模組) 本節內容 re模組介紹 使用re模組的步驟 re模組簡單應用示例 關於匹配物件的說明 說說正則表示式字串前的r字首 re模組綜合應用例項 參考文件 提示: 由於該站對MARKDOWN的表格支援的不是很好,所以本文中的表
python之正則表示式:re模組
一.正則表示式中常用的字元含義 1、普通字元和11個元字元: 常用字元劃分 匹配範圍 示例資料 匹配的正則表示式 目標匹配的字串 普通字元 匹配自身 abc
Python之正則表示式
正則表示式元字元如下:. ^ $ * + ? { } [ ] \ | ( ) . 匹配除換行符以外的所以字元 ^ 規定匹配模式必須出現在目標字串的開頭,例如:^hell hello hellboy $ 規定匹配模式必須出現在目標字串的結尾
python之正則表示式(基礎篇)
前言 在向網頁進行了提交請求之類的之後,我們可以得到了網頁的返回內容,裡面自然而然會有我們想要的資料,但是html元素文字這麼多,我們不可能一 一去找我們需要的資料,這時就需要用到正則表示式了,正則表示式是學爬蟲必須學的內容,而且不止python可以用,jav
Python爬蟲之正則表示式(1)
廖雪峰正則表示式學習筆記 1:用\d可以匹配一個數字;用\w可以匹配一個字母或數字; '00\d' 可以匹配‘007’,但是無法匹配‘00A’; ‘\d\d\d’可以匹配‘010’; ‘\w\w\d’可以匹配‘py3’; 2:.可以匹配任意字元; 'py.'可以匹配'pyc'、
python網路基礎之正則表示式
下面是我對正則表示式的一些簡單介紹,它多用於爬蟲,用來定製規則 # 正則表示式匯入模組 import re # match只匹配字串的頭 # re.match(正則表示式,需要處理的字串) re.match(r"hello", "hello world") # 大小寫的匹配 re.m
網路爬蟲必備知識之正則表示式
就庫的範圍,個人認為網路爬蟲必備庫知識包括urllib、requests、re、BeautifulSoup、concurrent.futures,接下來將結對re正則表示式的使用方法進行總結 1. 正則表示式概念 正則表示式是對字串操作的一種邏輯公式,就是用事先定義好的一些特定字元、及這些特定字
Python爬蟲之正則表示式的使用(三)
import re html = ''' <div class="slide-page" style="width: 700px;" data-index="1"> <a class="item" target="_blank" href="https:
python爬蟲學習之正則表示式的基本使用
一、正則表示式 1. 正則表示式是字串處理的有力工具和技術。 2. 正則表示式使用某種預定義的模式去匹配一類具有共同特徵的字串,主要用於處理字串,可以快速、準確地完成複雜的查詢、替換等處理要求,在文字編輯與處理、網頁爬蟲之類的場合中有重要應用。 3. Python中,re模組提供了正則表示式操作所需
模擬登陸CSDN -- Python爬蟲練習之正則表示式和cookie
這周學習的主題是正則表示式和cookie,原本是計劃每天晚上11點下班到家,練上一兩個鍾就把這部分過了,結果這周各種事情和不再狀態,所以沒整完,直至今天才把相關問題過掉。其實這部分也挺不錯的,也並沒有想象中容易,所以好事多磨。這周練習的綜合習題就是模擬登陸C
Python爬蟲入門七之正則表示式
在前面我們已經搞定了怎樣獲取頁面的內容,不過還差一步,這麼多雜亂的程式碼夾雜文字我們怎樣把它提取出來整理呢?下面就開始介紹一個十分強大的工具,正則表示式! 1.瞭解正則表示式 正則表示式是對字串操作的一種邏輯公式,就是用事先定義好的一些特定字元、及這些
python入門之正則表示式
正則 通過re模組實現 eg:>>>import re >>>re.findall('abc',str_name) 在strname裡面完全匹配字串abc,返回列表['abc'],有多個則返回多
Python學習手冊之正則表示式和元字元
在上一篇文章中,我們介紹了 Python 的資料封裝、類方法、靜態方法和屬性函式,現在我們介紹 Python 的正則表示式和元字元。檢視上一篇文章請點選:https://www.cnblogs.com/dustman/p/10019973.html 正則表示式正則表示式是一種強大的字串
python學習筆記之正則表示式1
正則表示式 正則表示式即RE,我們可以使用正則表示式來匹配字串集,其實正則表示式是一個小型的程式語言。它可以方便我們對於文字任務的操作。 對於python來說,re模組就是正則式操作模組。 元字元:元字元是特殊的字元,普通的字元在正則表示式中都可以用來匹配自己,如正則表示
爬蟲之正則表示式基礎篇
一 點睛 1 正則表示式工具 http://tool.oschina.net/regex/ 2 測試一下 Hello, my phone number is 029-86432100 and email is [email protected]
Python學習筆記之正則表示式
1、import re # 匯入python正則表示式模組2、正則匹配兩種方式:p = re.compile(r'imooc') # 生成Pattern物件 res = p.match('imooc python') # 呼叫 patern 物件的 matc
python學習-正則表示式及re模塊
我只 com 返回 現在 輸出 -1 完全匹配 group clu python中的所有正則表達式函數都在re模塊中。import re導入該模塊。 1,創建正則表達式對象 想re.compile()傳入一個字符串值,表示正則表達式,它將返回一個Regex模式對象。 創建一
轉--python之正則入門
imp UNC htm ive 2.3 verbose tro 多個參數 內容 原文地址 1. 正則表達式基礎 1.1. 簡單介紹 正則表達式並不是Python的一部分。正則表達式是用於處理字符串的強大工具,擁有自己獨特的語法以及一個獨立的處理引擎,效率上可能不
Python中正則表示式re.match的用法
re.match(pattern, string, flags) 第一個引數是正則表示式,如果匹配成功,則返回一個Match,否則返回一個None; 第二個引數表示要匹配的字串; 第三個引數是標緻位,用於控制正則表示式的匹配方式,如:是否區分大小寫,多行匹配等等。 需要特別注意的是,這個方法並不是完