最近研究Python爬蟲,不少地方用到了正則表達式,可是沒好好研究,每次都得現查文檔。今天就專門看看Python正則表達式。本文參考了官方文檔 re模塊。html
首先正則表達式的語法我就不說了,這玩意卻是不算難,用的時候現查就好了——正則表達式_百度百科。python
在不少編程語言中,因爲有轉義字符這麼一種東西的存在,致使正則表達式須要使用兩個斜槓來處理。若是編程語言支持原始字符串,那麼就不須要兩個斜槓了。在Python中,字符串前面添加字母r便可把字符串變成原始字符串。git
下面是一個正則表達式最簡單的使用例子。咱們查找全部以字母F開頭的單詞,不論大小寫。這個例子使用了正則表達式模塊的re.findall
函數,它會返回全部符合模式的列表。正則表達式
import re text = 'fuck shit it make she forest' results = re.findall(r'\b[Ff]\w+', text) print(results)
若是某一個模式須要常用,咱們能夠把它編譯爲模式對象。而後從模式對象上調用各類正則查詢方法。這樣作的優勢是:因爲模式已經編譯了,因此後續的查詢速度會更快。編程
pattern = re.compile(r'\b[Ff]\w+') print(pattern.findall(text))
大部分查詢方法還能夠接受一個查詢標誌參數。查詢標誌讓正則表達式具備不一樣的行爲。下面一一說明。緩存
標誌 | 做用 |
---|---|
re.A、re.ASCII | 以ASCII模式查詢,默認是Unicode模式 |
re.DEBUG | 顯示編譯表達式的調試信息 |
re.I、re.IGNORECASE | 忽略字母的大小寫 |
re.L、re.LOCALE | 以區域敏感方式查詢匹配 |
re.M、re.MULTILINE | 開啓多行模式,開啓以後行邊界符^$ 會匹配每行的開始和結束,而不是整個字符串的開始和結束 |
re.S、re.DOTALL | 使用此標誌,會讓點符號匹配全部字符,默認狀況下點符號會匹配換行符之外的符號 |
re.X、re.VERBOSE | 開啓囉嗦模式,能夠在寫正則表達式的時候添加註釋 |
下面是囉嗦模式的例子,來自Python官方文檔。編程語言
a = re.compile(r"""\d + # the integral part \. # the decimal point \d * # some fractional digits""", re.X) b = re.compile(r"\d+\.\d*")
查詢方法有兩種形式,第一種是re模塊的函數,這些函數須要接受一個模式字符串。第二種就是從編譯好的模式對象上調用,這樣不須要模式字符串了。基本上大部分方法都有這兩種形式,因此這裏只須要介紹一種形式。函數
re.search(pattern, string, flags=0)
方法查詢字符串,返回第一個結果的匹配對象。無論有多少個知足條件的字符串,這個方法之返回第一個。若是查詢不到,就返回None。this
re.match(pattern, string, flags=0)
查詢字符串,當字符串的前面一部分和模式匹配的時候,會返回相應的匹配對象。若是不匹配,那麼返回None。須要注意即便開啓了多行模式,這個方法也只查詢字符串最前面的一部分,不會查詢每行的前面。url
re.fullmatch(pattern, string, flags=0)
,若是整個字符串和模式匹配,返回相應的匹配對象。不然返回None。
re.split(pattern, string, maxsplit=0, flags=0)
,按給定正則表達式分割字符串。
re.findall(pattern, string, flags=0)
,最經常使用的方法,返回一個列表,包含全部匹配模式的字符串。
re.finditer(pattern, string, flags=0)
,和findall方法相似,不過返回的是一個迭代器。
re.sub(pattern, repl, string, count=0, flags=0)
,將字符串中匹配模式的部分使用repl替換,返回替換後的字符串。
re.subn(pattern, repl, string, count=0, flags=0)
,和sub方法相似,不過返回元組(新字符串,替換的數量)
。
re.purge()
,清除正則表達式緩存。
在已編譯好的正則表達式對象上還有如下幾個屬性。
flags,正則表達式的全部標誌,包括flags參數設置的,compile方法編譯傳入的,以及正則表達式中自己的標誌。
groups,正則表達式中捕獲組的數量。
pattern,返回模式字符串。
groupindex,返回(?P<id>)
形式的命名組和組編號鍵值對組成的字典。
上面提到的不少方法都返回匹配對象。匹配對象包含了一些方法和屬性,方便咱們進行查詢。
最經常使用的就是group函數,它會返回指定組對應的字符串。下面的例子就查詢了給定數據中的數據量和每頁的條數。第0組返回整個匹配,第1組返回第一個匹配,以此類推……也能夠採用命名組的方式。
text = '總共20條數據 每頁5條' pattern = re.compile(r'總共(?P<total>\d+)條數據\s+每頁(?P<per>\d+)條') match = pattern.match(text) print(match.group(0))
另外一個比較經常使用的函數就是groups(default=None)
,它返回全部組組成的元組。若是有的組沒有匹配到字符串,就會顯示爲None,這時候可使用default參數指定默認值。
text = '總共20條數據 每頁5條' pattern = re.compile(r'總共(?P<total>\d+)條數據\s+每頁(?P<per>\d+)條') match = pattern.match(text) print(match.groups()) # 結果 # ('20', '5')
groupdict(default=None)
返回組名和字符串組成的字典。仍是上面的例子。
print(match.groupdict()) # {'total': '20', 'per': '5'}
start
和end
函數返回給定組的在字符串的起始和結束索引,若是對應的組沒有任何匹配,則返回-1。下面的例子來自Python官方文檔,從電子郵件地址中去除remove_this。
>>> email = "tony@tiremove_thisger.net" >>> m = re.search("remove_this", email) >>> email[:m.start()] + email[m.end():] 'tony@tiger.net'
match.span([group])
返回給定組的起始索引和結束索引組成的元組。
以上就是Python正則表達式的大部份內容了,靈活使用這些知識,能夠得到強大的功能。關於如何巧用,就看你們的智慧了。