您現在的位置是:首頁 > 棋牌

站長線上Python精講:Python中正則表示式的語法詳解

  • 由 站長世界 發表于 棋牌
  • 2022-02-16
簡介例如,將匹配不是字母的一個字元的正則表示式表示為模式字串,可以使用下面的程式碼:‘[^a-zA-Z]’而如果將匹配以字母m開頭的單詞的正則表示式轉換為模式字串,則不能直接在其兩側新增引號定界符,例如,下面的程式碼是不正確的

定界符怎麼輸入

歡迎你來到站長線上的站長學堂學習Python知識,本文學習的是《Python中正則表示式的語法詳解》。本知識點主要內容有9點:行定位符、元字元、限定符、字符集、排除字元、選擇字元、跳脫字元、分組、在Python中使用正則表示式語法。

站長線上Python精講:Python中正則表示式的語法詳解

關於Python中的正則表示式,準備分兩個知識點講完,今天來講解正則表示式的語法。

正則表示式的概念:正則表示式(regular expression,簡稱regex或者RE),也稱為歸則表示式。通常用來檢索、替換符合某些規則的文字。正則表示式就是記錄文字規則的程式碼。

1、行定位符

行定位符就是用來描述字串的邊界。“^”表示行的開始;“$”表示行的結尾。

例如:

One is All

All is One

^One

該表示式表示要匹配字串One的開始位置是行頭,如One is All就可以匹配,而All is One則不匹配。但如果使用:

One$

則All is One可以匹配,而One is All不能匹配。如果要匹配的字串可以出現在字串的任意部分,那麼可以直接寫成:

One

這樣,兩個字串就都可以匹配了。

2、元字元

元字元就是在正則表示式中具有特殊意義的專用字元。

剛才我們所說的“^”和“$”就是元字元,在Python有下面常用元字元:。、\w、\W、\s、\S、\d、\D、\b、^、$。

各種元字元及其說明如下:

。:匹配除換行符以外的任意字元

\w:匹配字母或數字或下劃線或漢字

\W:匹配特殊字元,即非字母、非數字、非漢字

\s:匹配任意的空白符

\S:匹配非空白

\d:匹配數字

\D:匹配非數字,即不是數字

\b:匹配單詞的開始或結束

^:匹配字串的開始

$:匹配字串的結束

我們來看一個例子:

\byi\w*\b

匹配以字母yi開頭的單詞,先匹配單詞開始處(\b),然後匹配字母yi,接著匹配任意數量的字母或數字(\w*),最後匹配單詞結束處(\b)。該表示式可以匹配如“yibenshu”“saneryi”“haoyige”“yi12345”等。

3、限定符

在上面的元字元的例子中,使用“\w*”匹配任意數量的字母或數字。如果想匹配特定數量的數字,該如何表示呢?正則表示式為我們提供了限定符(指定數量的字元)來實現該功能。

例如,匹配6位QQ號可用如下表達式:

^\d{6}$

常用的限定符如下所示:*、+、?、{n} 、{n,}、{n,m}、[] 。

各種限定符及說明及舉例如下:

* :匹配前面的字元零次或更多次。例如“zo*”能匹配“z” “zo”以及“zoo”,“*”等效於“{0,}”

+ :匹配前面的字元一次或更多次。例如“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”,“+”等效於“{1,}”

? :匹配前面的字元零次或一次。例如“do(es)?”可以匹配 “do”或 “does”中的“do”,“?”等效 於 “{0,1}”

{n} :匹配前面的字元n次。例如“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food” 中的兩個 o

{n,} :匹配前面的字元n次或更多次。例如“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o, 等效於“o+”,“o{0,}”則等效於“o*”

{n,m} :匹配前面的字元n到m次。其中 n<=m。最少匹配 n 次且最多匹配 m 次。例如“o{1,3}”將匹配“fooooood” 中的前三個“o”,“o{0,l}”等效於“0?”。注意在逗號和兩個數之間不能有空格

4、字符集

正則表示式查詢數字和字母是很簡單的,因為已經有了對應這些字元集合的元字元(如\d,\w),但是如果要匹配沒有預定義元字元的字元集合(比如母音字母a, e, i, o, u),應該怎麼辦?很簡單,只需要在方括號裡列出它們就行了,像[aeiou]就匹配任何一個英文母音字母。

[xyz]表示匹配裡面的任意一個字元。

[a-z]字元範圍,匹配指定範圍內的任意字元。例如“[a-z]”可以匹配“a”到“z”範圍內的任意小寫字母字元

[。?!]匹配標點符號“。”、“?”或“!”。也可以輕鬆地指定一個字元範圍,像[0-9]代表的含義與\d就是完全一致的:代表一位數字;同理,[a-z0-9A-Z_]也完全等同於\w(如果只考慮英文的話)。

要想匹配給定字串中任意一個漢字,可以使用[\u4e00-\u9fa5];如果要匹配連續多個漢字,可以使用[\u4e00-\u9fa5]+。

5、排除字元

上方的字符集是匹配符合指定字符集的字串。這裡的排除字元,剛剛相反。排除字元就是匹配不符合指定字符集的字串。在正則表示式中用“^”表示。我們在最開始的行定位符中也說到了“^”,放在開頭,在這裡放在方括號[]裡面,表示排除的意思。如:

[^a-zA-Z]

表示用於一個匹配非字母的字元。

6、選擇字元

Python中的選擇字元,包含著條件選擇的邏輯,在這裡使用“|”來表示。該字元可以理解為“或”。

如中國人的身份證號碼長度為15位或者18位。如果為15位,則全為數字;如果為18位,前17位為數字,最後一位是校驗位,可能為數字或字元X。

匹配身份證的表示式可以寫出如下方式:

(^\d{15}$)|(^\d{18}$)|(^\d{17})(\d|X|x)$

該表示式的意思是可以匹配15位數字,或者18位數字,或者17位數字和最後一位。最後一位可以是數字或者是X或者是x。

7、轉移字元

正則表示式中的跳脫字元(\)和Python中的大同小異,都是將特殊字元(如“。”“?”“\”等)變為普通的字元。

舉一個IP地址的例項,用正則表示式匹配如127。0。0。1這樣格式的IP地址。如果直接使用點字元,格式為:

[1-9]{1,3}。[0-9]{1,3}。[0-9]{1,3}。[0-9]{1,3}

這顯然不對,因為“。”可以匹配一個任意字元。這時,不僅是127。0。0。1這樣的IP,連127101011這樣的字串也會被匹配出來。所以在使用“。”時,需要使用跳脫字元(\)。修改後,上面的正則表示式格式為:

[1-9]{1,3}\。[0-9]{1,3}\。[0-9]{1,3}\。[0-9]{1,3}

站長線上提醒你:括號在正則表示式中也算是一個元字元。

8、分組

透過上面選擇字元中的例子,可以看見小括號的作用有了一定的瞭解。

小括號字元的第一個作用就是可以改變限定符的作用範圍

,如“|”“*”“^”等。來看下面的一個表示式。

(mon|ma)th

這個表示式的意思是匹配單詞month或math,如果不使用小括號,那麼就變成了匹配單詞mon和math了。

小括號的第二個作用是分組,也就是子表示式

。例如(\。[0-9]{1,3}){3},就是對分組(\。[0-9]{1,3})進行重複操作。

9、在Python中使用正則表示式語法

在Python中使用正則表示式時,是將其作為模式字串使用的。例如,將匹配不是字母的一個字元的正則表示式表示為模式字串,可以使用下面的程式碼:

‘[^a-zA-Z]’

而如果將匹配以字母m開頭的單詞的正則表示式轉換為模式字串,則不能直接在其兩側新增引號定界符,例如,下面的程式碼是不正確的。

‘\bm\w*\b’

而是需要將其中的“\”進行轉義,轉換後的程式碼為:

‘\\bm\\w*\\b’

由於模式字串中可能包括大量的特殊字元和反斜槓,所以需要寫為原生字串,即在模式字串前加r或R。例如,上面的模式字串採用原生字串表示就是:

r‘\bm\w*\b’

在編寫模式字串時,並不是所有的反斜槓都需要進行轉換。例如,前面編寫的正則表示式“^\d{6}$”中的反斜槓就不需要轉義,因為其中的\d並沒有特殊意義。不過,為了編寫方便,本教程所寫正則表示式都採用原生字串表示。

到此為止,本文學習的《Python中正則表示式的語法詳解》中的主要內容有9點:行定位符、元字元、限定符、字符集、排除字元、選擇字元、跳脫字元、分組、在Python中使用正則表示式語法。就全部講解完畢了。有問題,可以給我留言哦!

下一個知識點,我們講解《在Python中使用re模組實現正則表示式操作詳解》。歡迎你對站長線上進行關注,評論,點贊,分享、轉發!

Top