寫爬蟲不會正則表達式?看這篇文章試試
今天寫爬蟲偶然想到了初學正則表達式時候,看過一篇文章非常不錯。檢索一下還真的找到了。原文在這裡:Python: 正則表達式實例透析,作者是@米樂果果。
re模塊
import ren
re.search
經常用match = re.search(pat, str)的形式。因為有可能匹配不到,所以re.search()後面一般用if statement。
str = an example word:cat!!nmatch = re.search(rword:www, str)nif match:n print found, match.group() ## found word:cat else:n print did not findnfound word:catn# re.search return a match object, which contains lots of info print type(match)n<type _sre.SRE_Match>nprint match.string # source string print match.group()nprint match.start() # position of w print match.end() # position of t print match.endpos # position of last ! print match.span()nan example word:cat!!nword:catn11n19n21n(11, 19)n
re.match
re.match和re.search很相似,只是re.match是從字元串的開頭開始匹配。
s = python tutsnmatch = re.match(rpy,s)nif match:n print(match.group())npyns = python tutsnmatch = re.search(r^py,s)nif match:n print(match.group())npyn
常用正則字元意義
- a, X, 9,等字元匹配自己, 元字元不匹配自己,因為有特殊意義,比如 . ^ $ * + ? { }[ ] | ( )
- . 英文句號,匹配任意字元,不包含n
- w 匹配word字元,[a-zA-Z0-9]
- W 匹配非word字元
- b 匹配word和non-word之間邊界
- s 匹配單個whitespace字元,space, newline, return, tab, form [nrtf]
- S 匹配non-whitespace字元
- t, n, r 匹配tab, newline, return
- d 匹配數字[0-9]
- ^ 匹配字元串開頭
- $ 匹配字元串結尾
重複
『+』 一或多次, 『*』 零或多次, 『?』 零或一次
方括弧[]
# 提取email addressnstring = purple alice-b@gmail.com monkey dishwashernmatch = re.search(rw+@w+, string)nif match:n print match.group() ## b@googlenb@gmailn
[]類似於or
Square brackets can be used to indicate a set of chars, so [abc] matches a or b or c.match = re.search(r[w.-]+@[w.-]+,string)nif match:n print match.group()nalice-b@gmail.comn
Group Extraction圓括弧()
有時候需要提取匹配字元的一部分,比如剛才的郵箱,我們可能需要其中的username和hostname,這時候可以用()分別把username和hostname包起來,就像r([w.-]+)@([w.-]+),如果匹配成功,那麼pattern不改變,只是可以用match.group(1)和match.group(2)來username和hostname,match.group()結果不變。
string = purple alice-b@google.com monkey dishwashernmatch = re.search(r([w.-]+)@([w.-]+),string)nif match:n # Return subgroup(s) of the match by indices or names. print match.group() # or match.group(0) print match.group(1)n print match.group(2)nif match:n # Return a tuple containing all the subgroups of the match, from 1. print match.groups()nalice-b@google.comnalice-bngoogle.comn(alice-b, google.com)n
findall and groups
()和findall()結合,如果包括一或多個group,就返回a list of tuples。
str = purple alice@google.com, blah monkey bob@abc.com blah dishwasherntuples = re.findall(r([w.-]+)@([w.-]+), str)nprint tuples # [(alice, google.com), (bob, abc.com)] for tuple in tuples:n print tuple[0] # username print tuple[1] # hostn[(alice, google.com), (bob, abc.com)]nalicengoogle.comnbobnabc.comn
給re.search加^之後是一樣的。
re.sub
re.sub(pat, replacement, str)在str里尋找和pattern匹配的字元串,然後用replacement替換。replacement可以包含1或者2來代替相應的group,然後實現局部替換。
# replace hostnamenstr = alice@google.com, and bob@abc.com #returns new string with all replacements, # 1 is group(1), 2 group(2) in the replacement print re.sub(r([w.-]+)@([w.-]+), r1@yo-yo-dyne.com, str)nalice@yo-yo-dyne.com, and bob@yo-yo-dyne.comn
參考
- google edu
- python guru
作者:米樂樂果
鏈接:http://www.jianshu.com/p/922e9e56b017
來源:簡書
你想更深入了解學習Python知識體系,你可以看一下我們花費了一個多月整理了上百小時的幾百個知識點體系內容:
【超全整理】《Python自動化全能開發從入門到精通》筆記全放送
推薦閱讀:
※python做音頻節奏識別(beat detector)有沒有現成的庫 (js也行)?
※用Pyador進行『異常檢測』: 開發無監督機器學習工具庫(一)
※PyQt5系列教程(10):老闆,這個打一下
※Google Brain開源新的Python 庫:Tangent