Python正則表達式
Python正則表達式有一個模塊“re”,首先,在我們使用正則表達式的時候需要導入這個模塊:
import re
分三個部分來介紹Python正則表達式:
- 元字符
- 預定義字符
- 常用功能函數
一、常用字符(元字符)
注:python正則表達式元字符共11個,如下所示:
. |
\ |
* |
+ |
? |
^ |
$ |
| |
{} |
[] |
() |
下面將一一介紹:
(1)"."
功能:用於匹配任意(除\n)外的字符
如上,“.”能夠匹配任意字符。
注:search是常用的功能函數,將在第三部分介紹,這里只需要知道其第一個參數是模式,第二個參數是待匹配的字符串,返回結果是 match object對象。group是match object對象的方法。
即在字符串(第二個參數)中尋找能夠匹配的模式(第一個參數)
(2)“\”
功能:轉義字符,使后一個字符變為字面意思(取消元字符的特殊化)
如上實例可見,元字符“.”不再具有特殊意義,而僅僅是一個字面值(字符.)
(3)"*"
功能:匹配前一個字符0次或多次(貪婪匹配)
如上實例可見“*”前的字符b被匹配了3次
(4)“+”
功能:匹配前一個字符1次或無限次
如上實例可見“+”前的字符n被匹配了4次
(5)“?”
功能:匹配前一個字符0次或1次
如上實例分別展示了匹配“?”前的字符一次和零次。
注:具體是零次還是一次是根據字符串中遇到的模式來定的
(6)“^”
功能:匹配字符串的開頭(僅僅匹配開頭),多行模式中匹配每一行的開頭
- 注:提前了解(之所以說提前了解是因為后面會在第三部分詳細介紹)匹配失敗之所以會報如上實例的錯誤的原因:
因為search函數完成正則表達式的模式匹配,如果成功返回match object對象,如果失敗返回None。而group是match object對象的方法,None對象沒有這個方法所以報錯。
另:從如上實例的第二句也能夠發現,縱使字符串的其他部分(非開頭部分)有指定的模式(比如字符串的最末尾有abc),也不會再去匹配(因為^僅僅匹配開頭)。
(7)“$”
功能:匹配字符串的結尾(僅僅匹配結尾),多行模式中匹配每一行的結尾
如上實例,用“^”來理解“$”就非常清楚了。
(8)“|”
功能:匹配左右表達式任意一個
如上實例,“|”好比編程語言中的“或”
(9)“{}”
功能:{m},即匹配前一個字符m次。{m,n},即匹配前一個字符m至n次。
如上實例,“{}”中一旦指定了次數,那就一定在指定次數的范圍內
(10)“[]”
功能:字符集,對應的位置可以是字符集中的任意字符(注意是任意一個,從下面實例可發現),可逐個列出([abc]),也可以指定范圍([a-c])
如上實例只是簡單的應用字符集,字符集的作用非常大。
(11)“()”
功能:將表達式分組
如上實例,第一條有括號那么“a|k”為一個小組,即先匹配sdk然后再匹配a和k中的任意一個。
第二條沒有括號那么就是要么匹配sdka要么匹配k了
可見()的功能很簡單也很有用,能夠實現復雜的正則表達式
二、預定義字符
\d |
\D |
\s |
\S |
\w |
\W |
\A |
\Z |
\b |
\B |
下面一一介紹:
(1)“\d”
功能:匹配數字,即匹配[0-9]
如上實例,\d的作用就類似於之前講的[0-9],即,匹配任意一個數字
(2)“\D”
功能:匹配非數字,即[^\d]
如上實例,將d大寫就好比取反(下面也有很多這種情況),\D為匹配一個非數字
(3)“\s”
功能:匹配任何空白字符[空格,\t,\n,\r,\f,\v]
注:回車符(\r)、換行符(\n)、水平制表符(\t)、垂直制表符(\v)、換頁符(\f))
如上實例,\s匹配了一個空格符
(4)“\S”
功能:匹配任何非空把你字符(剛好與\s相反)
如上實例,\S實現的功能與\s正好相反。且\S匹配的任何非空白字符包括除了[空格,\t,\n,\r,\f,\v]的一切。
(5)“\w”
功能:匹配包括下划線在內的字符
如上實例,\w能夠匹配數字、字母、下划線(三者為python標識符的組成)但不能匹配特殊字符
(6)“\W”
功能:匹配特殊字符(與\w剛好相反)
如上實例,\W匹配的是特殊字符(非標識符),與\w剛好相反
(7)"\A"
功能:僅匹配字符串開頭(同之前將的元字符^類似)
如上實例,根據元字符^來理解便可
(8)“\Z”
功能:僅匹配字符串結尾(同之前的元字符$類似)
如上實例,根據元字符$來理解便可
(9)“\b”
功能:匹配單詞的邊界(即,單詞和非單詞之間的位置),可左可右
如上實例,第一條語句竟然出現匹配錯誤,出乎意料。其實,對比三條語句發現后兩條的模式參數前加了“r”
這是python比較尷尬的地方,因為如果不加“r”,字符串可能把其中的\b視為轉義字符(回退),所以造成了匹配效果出乎意料。
加上“r”讓\失去轉義的意思。所以建議寫正則表達式時在模式參數前面都加上"r"
另,\b能夠很方便的分離單詞。
(10)“\B”
功能:匹配單詞的內部,即[^\b]
如上實例,根據\b來理解\B已經很清晰了
三、常用功能函數
compile |
match |
search |
findall |
finditer |
split |
sub |
subn |
相面將對這些常用功能函數做一一介紹:
(1)“compile()”
功能:編譯正則表達式模式,返回一個對象模式。
語法:
re.compile(pattern,flags=0)
參數:pattern為指定的模式,flags為一個標志位(默認為零)
注:flags可取的值如下所示:
re.I |
re.M |
re.S |
re.X |
IGNORECASE, 忽略大小寫的匹配模式
|
MULTILINE,多行模式, 改變^和$的行為
|
DOTALL,此模式下 '.' 的匹配不受限制,可匹配任何字符,包括換行符,也就是默認是不能匹配換行符
|
VERBOSE,冗余模式, 此模式忽略正則表達式中的空白和#號的注釋
|
如上實例可見,利用compile將正則表達式編譯好后,調用search進行匹配只需指定字符串便可
(2)“match()”
功能:決定是否在字符串剛開始的位置進行匹配。
語法:
re.match(pattern,string,flags=0)
參數:pattern為指定的模式,string為待匹配的字符串,flags為一個標志位(默認為零)
返回類型:匹配成功返回match object對象,匹配失敗返回None對象
注:由於match匹配成功返回match object對象,現介紹match object對象的一些常用方法:
- group():返回被re匹配的字符串
- groups():返回一個包含所有小組字符串的元組
- start():返回匹配字符串開始的位置
- end():返回匹配字符串結束的位置
- span():返回一個元組,還元組由匹配字符串開始和結束的位置組成,即(開始位,結束位)注意,左閉右開
(3)“search()”
功能:在字符串中查找匹配模式,只要找到就第一個返回(match object對象),如未找到就返回None對象。
語法:
re.search(pattern,string,flags=0)
參數:pattern為指定的模式,string為待匹配的字符串,flags為一個標志位(默認為零)
返回類型:匹配成功返回match object對象,匹配失敗返回None對象
可見,之前已經用了太多的search方法來完成匹配:
可見span返回的是(2,4),即左閉右開,字符串的開始時2,而結束不包括4
(4)“findall()”
功能:遍歷匹配,獲取字符串中所有匹配成功的子字符串,返回一個列表。
語法:
re.findall(pattern,string,flags=0)
參數:pattern為指定的模式,string為待匹配的字符串,flags為一個標志位(默認為零)
返回類型:匹配成功的字符串組成的列表
如上實例可見,模式為[a-z]+,即所有為a-z(小寫字母)組成的單詞,從匹配結果也可以發現空格和“!”沒有匹配,大寫字母C也沒有進行匹配。
(5)“finditer()”
功能:搜索string,返回一個順序訪問每個匹配結果的迭代器。
語法:
re.finditer(pattern,string,flags=0)
參數:pattern為指定的模式,string為待匹配的字符串,flags為一個標志位(默認為零)
返回類型:一個迭代器對象,迭代器中的每個元素均是match object類的實例對象
如上實例可見,finditer不僅返回匹配成功的字符串的結果,也能夠返回起始、結束下標等
(6)“split()”
功能:分割字符串。
語法:
re.split(pattern,string[,maxspilt])
參數:pattern為指定的分割符,string為待分割的字符串,可選參數,maxsplit為最大分割次數(即最多只准將string切maxsplit刀)
返回類型:一個列表,列表中的元素是被分割后的字符串,即List[String]
(7)“sub()”
功能:替換字符串中的每個子串。
語法:
re.sub(pattern,repl,string,count)
參數:pattern為模式,repel為替換的內容,string待匹配的字符串,count默認為0,為替換個數(即,先用模式去匹配字符串,然后repl將匹配到的東西取代)
返回類型:返回替換后的字符串
(8)“subn()”
功能:替換字符串中的每個子串。
語法:
re.subn(pattern,repl,string,count)
參數:pattern為模式,repel為替換的內容,string待匹配的字符串,count默認為0,為替換個數(即,先用模式去匹配字符串,然后repl將匹配到的東西取代)
返回類型:返回替換后的字符串與替換次數組成的元組,即(替換后的字符串,替換次數)