Python正則表達式


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將匹配到的東西取代)

返回類型:返回替換后的字符串與替換次數組成的元組,即(替換后的字符串,替換次數)

 


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM