您好,登錄后才能下訂單哦!
本文實例講述了Python爬蟲之正則表達式基本用法。分享給大家供大家參考,具體如下:
一、簡介
正則表達式,又稱正規表示式、正規表示法、正規表達式、規則表達式、常規表示法(英語:Regular Expression,在代碼中常簡寫為regex、regexp或RE),計算機科學的一個概念。正則表達式使用單個字符串來描述、匹配一系列匹配某個句法規則的字符串。在很多文本編輯器里,正則表達式通常被用來檢索、替換那些匹配某個模式的文本。
compile 函數根據一個模式字符串和可選的標志參數生成一個正則表達式對象。該對象擁有一系列方法用于正則表達式匹配和替換。
二、使用方法
1、簡單看一下寫法
函數語法:
re.match(pattern, string, flags=0)
函數參數說明:
參數 | 描述 |
---|---|
pattern | 匹配的正則表達式 |
string | 要匹配的字符串。 |
flags | 標志位,用于控制正則表達式的匹配方式,如:是否區分大小寫,多行匹配等等。 |
匹配成功re.match
方法返回一個匹配的對象,否則返回None。
我們可以使用group(num)
或 groups()
匹配對象函數來獲取匹配表達式。
匹配對象方法 | 描述 |
---|---|
group(num=0) | 匹配的整個表達式的字符串,group() 可以一次輸入多個組號,在這種情況下它將返回一個包含那些組所對應值的元組。 |
groups() | 返回一個包含所有小組字符串的元組,從 1 到 所含的小組號。 |
import re p = re.compile('abcd') print(type(p)) #<class '_sre.SRE_Pattern'> print(dir(p)) #['__class__', '__copy__', '__deepcopy__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'findall', 'finditer', 'flags', 'fullmatch', 'groupindex', 'groups', 'match', 'pattern', 'scanner', 'search', 'split', 'sub', 'subn'] m = p.match('abcdef') print(type(m)) #<class '_sre.SRE_Match'> print(dir(m)) #['__class__', '__copy__', '__deepcopy__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'end', 'endpos', 'expand', 'group', 'groupdict', 'groups', 'lastgroup', 'lastindex', 'pos', 're', 'regs', 'span', 'start', 'string'] print(m.group()) #abcd print(m.group(0)) #abcd
re.match()
方法值匹配字符串的開頭如果不滿足,就返回一個None
import re p = re.compile('abcd') m = p.match('abdcef') print(m.group()) #AttributeError: 'NoneType' object has no attribute 'group'
神奇的.
import re p = re.compile('.') m = p.match('abdcef') print(m.group()) #a
特殊字符(元字符)
注意:\在里面是轉義詞的意思,例如,你想匹配一個re.compile('.')
,這個.是匹配任意字符。但是我就想讓它匹配一個.怎么辦,re.compile('\.')
,這樣的話它就真的只匹配一個點。
re.findall()
import re p = re.compile('\.') #匹配符號點(注意這里可前面加上了轉義符\,就不是匹配任意字符了) m = p.findall('abc.def.') print(type(m)) #<class 'list'> print(m) #['.', '.'] #可以得出,返回的是一個list,全局查找,不想match方法只匹配字符串開頭
數量詞:
貪婪模式和非貪婪模式
1、一個小例子
我們知道*表示匹配一個字符串0次或者多次,而+是匹配字符串1次或多次,所以*的時候匹配了0次也打印出來了,而+只找匹配1次的字符。
import re p = re.compile('[abc]+') m = p.findall('abcdef') print(m) #* #['abc', '', '', '', ''] #+ #['abc']
貪婪與非貪婪模式影響的是被量詞修飾的子表達式的匹配行為,貪婪模式在整個表達式匹配成功的前提下,盡可能多的匹配.
而非貪婪模式在整個表達式匹配成功的前提下,盡可能少的匹配。
2、{}
根據下面的例子不難看出,數量詞{m}表示的是匹配前面字符串的幾個字符串
import re p = re.compile('[abc]{3}') m = p.findall('abcdabcd') print(m) #{1} #['a', 'b', 'c', 'a', 'b', 'c'] #{2} #['ab', 'ab'] #{3} #['abc', 'abc']
re.search方法
re.search
掃描整個字符串并返回第一個成功的匹配,否則返回的是None(注意findall返回的是list,而search返回的直接就是字符串)
import re p = re.compile('abcd') m = p.search('abcdabcd') print(m.group())
檢索和替換
Python 的 re 模塊提供了re.sub用于替換字符串中的匹配項。
語法:
re.sub(pattern, repl, string, count=0, flags=0)
參數:
示例一:
替換一#開頭的所有字符(匹配任意字符0次或者多次),替換成無。
import re phone = "2004-959-559 # 這是一個國外電話號碼" num = re.sub('#.*','',phone) print(num)
示例一:擴展
找到所有非數字的字符,‘'代表著刪除。
import re phone = "2004-959-559 # 這是一個國外電話號碼" num = re.sub('\D','',phone) print(num)
正則表達式修飾符 - 可選標志
正則表達式可以包含一些可選標志修飾符來控制匹配的模式。修飾符被指定為一個可選的標志。多個標志可以通過按位 OR(|) 它們來指定。如 re.I | re.M 被設置成 I 和 M 標志:
PS:這里再為大家提供2款非常方便的正則表達式工具供大家參考使用:
JavaScript正則表達式在線測試工具:
http://tools.jb51.net/regex/javascript
正則表達式在線生成工具:
http://tools.jb51.net/regex/create_reg
更多關于Python相關內容可查看本站專題:《Python正則表達式用法總結》、《Python數據結構與算法教程》、《Python函數使用技巧總結》、《Python字符串操作技巧匯總》、《Python入門與進階經典教程》及《Python文件與目錄操作技巧匯總》
希望本文所述對大家Python程序設計有所幫助。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。