IT Xiao Ang Zai 2019年3月12號
版本:python3.7
編程軟件:Pycharm,Sublime Text 3
這裏要介紹的是python的re模塊中正則表達式的語法,其他的暫時不介紹,有興趣的朋友可以自行了解。
一:正則表達式簡介
在編寫處理字符串的程序的時候,經常需要查找某些複雜規則的字符串。正則表達式通常被用來檢索、替換那些符合某個模式(規則)的文本字符串。用事先定義好的一些特定字符、及這些特定字符的組合,組成一個“字符串模式規則”,匹配這些模式規則對應的字符串。
二:re模塊
在python中,用re模塊實現正則表達式。re模塊使python語言擁有全部的正則表達式功能。
如果需要重複使用正則表達式,可以先將其編譯成模式對象,用compile()函數。它根據一個模式字符串和可選的標誌參數生成一個正則表達式對象。生成的對象可以用一些方法進行正則表達式和匹配。
re模塊也可以直接引用一些函數實現和正則表達式的方法相同的功能。下面會一一介紹一些常用的正則表達式的內容。
四:處理函數(常用)
1.re.search()函數
作用:在整個字符串中查找並返回第一個成功的匹配。
格式:re.search(pattern,string,flags=0)
參數說明:
pattern | 匹配的正則模式 |
string | 匹配的字符串 |
flags | 編譯標誌位,用於控制正則表達式的匹配方式 |
返回值:匹配成功返回一個匹配的對象,否者返回None。
獲取正則表達式:可以用group(num)或groups()匹配對象函數獲取匹配表達式。
group(num):一次可以輸入多個組號,根據num匹配對應的值並生成元組,從1開始。
groups():返回一個包含所有子組字符串的元組。
2.re.match()函數
作用:如果不是起始位置匹配成功的話,就返回None。
格式:re.match(pattern,string,flags=0)
參數說明:
pattern | 匹配的正則模式 |
string | 匹配的字符串 |
flags | 編譯標誌位,用於控制正則表達式的匹配方式 |
返回值:匹配成功返回一個匹配的對象,否則返回None。
這裏可以發現,它和search()函數類似。但還是有區別:
re.match只匹配開始,如果開始不符合正則模式,就匹配失敗,函數返回None;而re.search匹配整個字符串,只要找到一個匹配符合就算成功。
3.正則表達式對象中的search(),match()方法和re.search(),re.match()的區別
先來看一下它們的原型:
import re
re.search(pattern,string,flags=0)
p.search(string[,pos[,endpos]])
re.match(pattern,string,flags=0)
p.match(string[,pos[,endpos]])
其實可以看到,正則表達式對象就是把re.search()與re.match()其中的pattern和編譯標誌在用compile()函數生成正則表達式對象時就用了,這裏直接寫string參數把要匹配的字符串添加即可。
其他區別:
(1) re.search()與re.match()返回的是一個匹配的對象,需要使用group()或groups()纔可以獲得匹配的字符串。
(2)正則表達式對象對應的方法可以設置搜索的開始位置和結束位置。
(3)start(),end()和span()分別返回匹配的開始位置,結束位置以及匹配的範圍。
實例:
import re
#re.search()與re.match()
a = "This is my best love thing."
print(re.search("is",a)) #不在開始位置匹配
print(re.search("is",a).span()) #不在開始位置匹配,用span()表示範圍
print(re.search("my",a).group()) #不在開始位置匹配,用group()查找內容
print(re.match("my",a)) #不在開始位置匹配
print(re.match("This",a)) #在開始位置匹配
print(re.match("This",a).start()) #在開始位置匹配,用start()表示開始位置
print(re.match("This",a).end()) #在開始位置匹配,用end()表示結束位置
print(re.match("This",a).span()) #在開始位置匹配,用span()表示範圍
print(re.match("This",a).group()) #在開始位置匹配,用group()查找內容
print(re.match("This",a).group(0)) #在開始位置匹配,用group()查找內容
k = re.compile("This is")
print(k.search(a).group()) #在開始位置匹配,用group()查找內容
結果如下:
4.re.sub()函數
作用:替換字符串中的匹配項。
格式:re.sub(pattern,repl,string,count=0)
參數說明:
pattern | 正則中的模式字符串 |
repl | 替換的字符串,也可以爲一個函數 |
string | 要被替換的字符串 |
count | 模式替換後的最大次數,默認0表示替換所有的匹配 |
返回值:替換後的字符串。
5.compile()函數
作用:編譯正則表達式,生成一個正則表達式模式對象,配合search()和match()函數使用。
格式:re.compile(pattern[,flags])
參數說明:
pattern | 字符串形式的正則表達式 |
flags | 編譯標誌(匹配模式),可以修改正則表達式的工作方式 |
flags具體參數爲:
標誌 | 含義 |
ASCI,A(re.A) | 使得轉義字符如 \w, \W, \b, \B, \d, \D, \s, \S只能匹配ASCII字符,僅對Unicode模式有意義 |
DOTALL,S(re.S) | 使得點號(.)匹配任何符號,包括換行符 |
IGNORECASE,I(re.I) | 匹配的時候不區分大小寫 |
LOCALE,L(re.L) | 表示特殊字符集 \w, \W, \b, \B, \s, \S 依賴於當前語言(區域)設置,而不是Unicode數據庫 |
MULTLINE,M(re.M) | 多行匹配,影響^和$,使得^不僅匹配字符串的開頭,還匹配每一行的行首;$不僅匹配字符串的結尾,還匹配每一行的行尾 |
VERBOSE,X(for 'extended')(re.X) | 啓動詳細的正則表達式,忽略空格和'#'後面的註釋,可以使用註釋'#',除了'\#',其它'#'都會被當作註釋 |
其中re.compile()只是生成一個模式對象,該對象有很多實用方法:
比如search(),match(),sub(),group(),start(),end(),span(),用法和上面的相同。
還有下面幾個方法:
(1)findall()方法
作用:在字符串中找到正則表達式所匹配的所有子串,並返回一個列表,如果沒有找到匹配的,則返回空列表。
格式:findall(string[,pos[,endpos])
參數說明:
string 待匹配的字符串。
pos 可選參數,指定字符串的起始位置,默認爲 0。
endpos 可選參數,指定字符串的結束位置,默認爲字符串的長度。
(2)re.finditer()
作用:在找到正則表達式所匹配的所有子串,並把它們作爲一個迭代器返回。
格式:re.finditer(pattern,string,flags=0)
參數說明:
pattern | 匹配的正則表達式 |
string | 要匹配的字符串。 |
flags | 編譯標誌位 |
(3)re.split()
作用:按照能夠匹配的子串將字符串分割後返回列表。
格式:re.split(pattern,string[,maxsplit=0,flags=0])
參數說明:
pattern | 匹配的正則表達式 |
string | 要匹配的字符串。 |
maxsplit | 分隔次數,maxsplit=1 分隔一次,默認爲 0,不限制次數。 |
flags | 編譯標誌位 |
三:簡單匹配
1.通配符
正則表達式可以用一個點號(.)表示,可以匹配除了換行符之外的任何字符,如果用compile()生成的模式對象,還可以傳入編譯標誌re.S,使其可以匹配所有字符。
2.反斜槓
反斜槓的用法有兩種,既可以剝奪元字符的特殊能力,又可以讓一些特殊字符擁有一些特殊能力,你如\d就可以匹配數字。
3.字符類
可以用中括號[]將任何內容包起來形成一個字符類,只要匹配這個字符類中的任何字符,就算匹配成功。對於字母來說,是區分大小寫的,可以用編譯標誌re.I改變,或者修改一下。用小斜槓"-"表示範圍。
4.重複匹配
用大括號這對元字符來實現重複匹配的功能,可以有個範圍。
四:常用的元字符
由於正則表達式的元字符有很多,下面介紹幾個實際上常用的元字符:
1.點號(.)
點號就是通配符,匹配除了換行符之外的任何字符,如果用compile()生成的模式對象,還可以傳入編譯標誌re.S,使其可以匹配所有字符。
2.脫字符(^)
脫字符表示字符串的開始位置,只有字符串出現在開頭纔會匹配。
3.美元符($)
脫字符表示字符串的結束位置,只有字符串出現在末尾纔會匹配。
4.重複符(*,+,?)
星號(*)相當於{0,}
加號(+)相當於{1,}
問號(?)相當於{0,1}
5.大括號{}
大括號{}用於重複次數。如果前面是一個子組,表示子組的重複次數。也可以表示範圍。
6.中括號[]
中括號是一個字符集合,被其包含的元字符都失去了特殊的功能。可以看成普通的字符。除了一些符號,比如小斜槓(-)表示範圍,反斜槓(\)轉義,脫字符(^)取反。
7.管道符(|)
管道符和邏輯或的功能類似。
8.小括號()
小括號的功能是把裏面的東西變成元組。
9.反斜槓(\)
除了上面說的功能以外,反斜槓如果跟數字在1-99,表示對應的子組所匹配的字符串;如果跟數字是0開頭或三位數字,表示一個八進制數對應的ASCII字符。
五:特殊字符
就是反斜槓後面加一些東西后對應的模式字符,下面是常用的:
\d | 匹配數字。 |
\D | 匹配非數。 |
\s | 匹配空白字符, |
\S | 匹配非空白字符。 |
\w | 匹配包括下劃線的任何單詞字符。 |
\W | 匹配任何非單詞字符。 |
上面就是正則表達式的基本內容,在之後的文章中就會配合爬蟲進行他們的實例運用。