Python基礎15(正規表示式)

2022-05-22 23:06:10 字數 4304 閱讀 3824

官方定義:正規表示式是對字串操作的一種邏輯公式,就是用事先定義好的一些特定字元、及這些特定字元的組合,組成乙個「規則字串」,這個「規則字串」用來表達對字串的一種過濾邏輯。

處理同一位置上,可以出現的字元範圍

字元組概念及表示方法 : [字元組]

在同乙個位置可能出現的各種字元組成了乙個字元組,在正規表示式中用表示     

字元分為很多類,比如數字、字母、標點等等。     

假如你現在要求乙個位置"只能出現乙個數字",那麼這個位置上的字元只能是0、1、2...9這10個數之一。

正則

待匹配字元

匹配結果

說明

[0123456789]

ture

在乙個字元組裡列舉合法的所有字元,字元組裡的任意乙個字元和"待匹配字元"相同都視為可以匹配

[0123456789]

afalse

由於字元組中沒有"a"字元,所以不能匹配

[0123456789a]

ature

經修改後字元組中已經含有a字元故可以匹配

[0-9]

ture

也可以用-表示範圍,[0-9]就和[0123456789]是乙個意思

[a-z]

cture

同樣的如果要匹配所有的小寫字母,直接用[a-z]就可以表示

[a-z]

cture

[a-z]就表示所有的大寫字母

[0-9a-fa-f]

eture

可以匹配數字,大小寫形式的a~f,用來驗證十六進製制字元

[a-z]

cture

注意此方法雖可以驗證但存在缺陷此區間內還存在反斜槓和下劃線等幾個特殊字元,故此測試不準確

關於(-)表示範圍的本質為:對照的ascii碼表    ascii碼表連線

元字元匹配內容

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

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

\s匹配任意的空白符

\d匹配數字

\n匹配換行符

\t匹配製表符

\b匹配乙個單詞的結尾

匹配字串的開始

匹配字串的結尾

\w匹配非字母或數字或下劃線

\d匹配非數字

\s匹配非空白符

a|b匹配字元a或字元b(|)

匹配字元組中的字元

匹配括號內的表示式,也表示乙個組

匹配除了字元組中字元的所有字元

量詞用法

重複零次或者更多次

重複一次或者更多次

重複零次或者一次

重複n次

重複n次或者更多次

重複m到n次

正則帶匹配字元

匹配結果

說明阿.

阿三阿四阿五

阿三阿四阿五

匹配所有『阿.』的字元

^阿.阿三阿四阿五

阿三隻從開頭匹配『阿.』

阿.$阿三阿四阿五

阿五隻匹配結尾的『阿.$

正則待匹配字元

匹配結果

說明馬.?

馬雲和馬化騰和馬二胖子

馬雲馬化

馬二?表示重複零次或一次,即只匹配"馬"後面乙個任意字

馬.+馬雲和馬化騰和馬二胖子

馬雲和馬化騰和馬二胖子

*表示重複零次或多次,即匹配"馬"後面0或多個任意字元

馬.*馬雲和馬化騰和馬二胖子

馬雲和馬化騰和馬二胖子

+表示重複一次或多次,即只匹配"馬"後面1個或多個任意字元

馬.馬雲和馬化騰和馬二胖子

馬雲和馬化騰

馬二胖

匹配1到2次任意字元

ps:前面的*,+,?等都是貪婪匹配,也就是盡可能匹配,後面加?號使其變成惰性匹配

正則待匹配字元

匹配結果

說明馬.*?

馬雲和馬化騰和馬二胖子馬馬

馬惰性匹配 正則

待匹配字元

匹配結果

說明馬[雲化騰二胖子]*

馬雲和馬化騰和馬二胖子

馬雲馬化騰

馬二胖子

表示匹配『馬』後面[雲化騰二胖子] 的字元任意次

馬[^和]*

馬雲和馬化騰和馬二胖子

馬雲馬化騰

馬二胖子

表示匹配乙個不是"和"的字元任意次

[\d]

123abc45

表示匹配任意乙個數字,匹配到5個結果

[\d]+

123abc45

表示匹配任意個數字,匹配到2個結果

分組 ()與 或 |[^]

身份證號碼是乙個長度為15或18個字元的字串,如果是15位則全部有數字組成,首位不能為0;如果是18位,則前17位全部是數字,末位可能是數字或x,下面我們嘗試用正則來表示:

正則帶匹配字元

匹配結果

說明^[1-9]\d[0-9x]$

表示可以匹配乙個正確的身份證號ps但是}此處無法控制長短可能是14或15位導致身份證長度判斷失真

^[1-9]\d[0-9x]$

表示也可以匹配這串數字,但這並不是乙個正確的身份證號碼,它是乙個16位的數字

^[1-9]\d(\d[0-9x])?$

false

現在不會匹配錯誤的身份證號了

()表示分組,將\d[0-9x]分成一組,就可以整體約束他們出現的次數為0-1次

^([1-9]\d[0-9x]|[1-9]\d)$

表示先匹配[1-9]\d[0-9x]如果沒有匹配上就匹配[1-9]\d

^([1-9]\d$|^[1-9][\d][0-9x])$

表示先匹配^([1-9]\d$如果14位的不符合再匹配^[1-9][\d][0-9x])$

在正規表示式中,有很多有特殊意義的是元字元,比如\d和\s等,如果要在正則中匹配正常的"\d"而不是"數字"就需要對"\"進行轉義,變成'\\'。

在python中,無論是正規表示式,還是待匹配的內容,都是以字串的形式出現的,在字串中\也有特殊的含義,本身還需要轉義。所以如果匹配一次"\d",字串中要寫成'\\d',那麼正則裡就要寫成"\\\\d",這樣就太麻煩了。這個時候我們就用到了r'\d'這個概念,此時的正則是r'\\d'就可以了。

正則待匹配字元

匹配結果

說明\d

\dfalse

因為在正規表示式中\是有特殊意義的字元,所以要匹配\d本身,用表示式\d無法匹配

\\d\d

true

轉義\之後變成\\,即可匹配

"\\\\d"

'\\d'

true

如果在python中,字串中的'\'也需要轉義,所以每乙個字串'\'又需要轉義一次

r'\\d'

r'\d'

true

在字串之前加r,讓整個字串不轉義

貪婪匹配:在滿足匹配時,匹配盡可能長的字串,預設情況下,採用貪婪匹配

正則待匹配字元

匹配結果

說明<.*>

......

預設為貪婪匹配模式,會匹配盡量長的字串

<.*?>

r'\d'

加上?為將貪婪匹配模式轉為非貪婪匹配模式,會匹配盡量短的字串

幾個常用的非貪婪匹配pattern

*? 重複任意次,但盡可能少重複

+? 重複1次或更多次,但盡可能少重複

?? 重複0次或1次,但盡可能少重複

? 重複n到m次,但盡可能少重複

? 重複n次以上,但盡可能少重複

.*?的用法

. 是任意字元

*是取 0 至 無限長度

? 是非貪婪模式。

何在一起就是 取盡量少的任意字元,一般不會這麼單獨寫,他大多用在:

.*?x

就是取前面任意長度的字元,直到乙個x出現

15 正規表示式

正規表示式,就是從一段字串中提取需要的字串 需要引入的模組 re,常用的函式 re.findall 引數1,引數2,引數3 引數1,表示用什麼規則進行提取 引數2,表示從 提取。返回值是乙個列表 引數3,re.i 表示不區分大小寫,re.s 匹配多行中符合條件的值 1 萬用字元,表示匹配某個字元後面...

Python 正規表示式(基礎)

正規表示式 regular expression 是乙個特殊的字串行,描述了一種字串匹配的模式可以用來檢查乙個串是否含有某種子串 將匹配的子串替換或者從某個串中取出符合某個條件的子串,或者是在指定的文章中,抓取特定的字串等。python處理正規表示式的模組是re模組,它是python語言擁有全部的正...

Python正規表示式基礎

直接給出字元就是精確匹配。特殊字元首先需要轉義如 d 匹配乙個數字,w 匹配乙個字母或者數字。123 d 可以匹配 1231 但是無法匹配 123a d d d 可以匹配到 123 w w w 可以匹配到 py3 表示任意乙個字元,py.可以表示py3 py 等 表示任意長個字元,表示至少乙個字元,...