學習手扎20190326 初解正規表示式

2021-09-13 18:49:10 字數 3701 閱讀 4303

首先你要知道的是,談到正則,就只和字串相關了。在我給你提供的工具中,你輸入的每乙個字都是乙個字串。

其次,如果在乙個位置的乙個值,不會出現什麼變化,那麼是不需要規則的。

比如你要用"1"去匹配"1",或者用"2"去匹配"2",直接就可以匹配上。這連python的字串操作都可以輕鬆做到。

那麼在之後我們更多要考慮的是在同乙個位置上可以出現的字元的範圍。

正則
待匹配字元
匹配

結果

說明

[0123456789]
8
true
在乙個字元組裡列舉合法的所有字元,字元組裡的任意乙個字元

和"待匹配字元"相同都視為可以匹配

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

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

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

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

[0-9a-fa-f]
e
true
可以匹配數字,大小寫形式的a~f,用來驗證十六進製制字元
字元:

元字元
匹配內容
. 匹配除換行符以外的任意字元

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

\s匹配任意的空白符

\d匹配數字

\n匹配乙個換行符

\t匹配乙個製表符

\b匹配乙個單詞的結尾

^匹配字串的開始

$匹配字串的結尾

\w

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

匹配非數字
\s

匹配非空白符
a|b

匹配字元a或字元b
()

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

匹配字元組中的字元
[^...]

匹配除了字元組中字元的所有字元
量詞:

量詞
用法說明
*重複零次或更多次

+重複一次或更多次

?重複零次或一次

重複n次

重複n次或更多次

重複n到m次

正則待匹配字元

匹配結果

說明海.

海燕海嬌海東

海燕海嬌海東

匹配所有"海."的字元

^海.海燕海嬌海東

海燕只從開頭匹配"海."

海.$海燕海嬌海東

海東只匹配結尾的"海.$"

正則待匹配字元

匹配結果

說明李.?

李傑和李蓮英和李二棍子

李傑李蓮

李二

?表示重複零次或一次,即只匹配"李"後面乙個任意字元
李.*李傑和李蓮英和李二棍子

李傑和李蓮英和李二棍子

*表示重複零次或多次,即匹配"李"後面0或多個任意字元
李.+李傑和李蓮英和李二棍子

李傑和李蓮英和李二棍子

+表示重複一次或多次,即只匹配"李"後面1個或多個任意字元
李.李傑和李蓮英和李二棍子

李傑和李蓮英

李二棍

匹配1到2次任意字元
注意:前面的*,+,?等都是貪婪匹配,也就是盡可能匹配,後面加?號使其變成惰性匹配

正則待匹配字元

匹配結果

說明李.*?

李傑和李蓮英和李二棍子李李

李惰性匹配

正則待匹配字元

匹配結果

說明李[傑蓮英二棍子]*

李傑和李蓮英和李二棍子

李傑李蓮英

李二棍子

表示匹配"李"字後面[傑蓮英二棍子]的字元任意次
李[^和]*

李傑和李蓮英和李二棍子

李傑李蓮英

李二棍子

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

456bdha345

63

表示匹配任意乙個數字,匹配到4個結果
[\d]+

456bdha3

4563

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

正則待匹配字元

匹配結果

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

110101198001017032

表示可以匹配乙個正確的身份證號

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

1101011980010170

表示也可以匹配這串數字,但這並不是乙個正確的身份證號碼,它是乙個16位的數字
^[1-9]\d(\d[0-9x])?$

1101011980010170

false

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

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

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

110105199812067023

表示先匹配[1-9]\d[0-9x]如果沒有匹配上就匹配[1-9]\d
在正規表示式中,有很多有特殊意義的是元字元,比如\n和\s等,如果要在正則中匹配正常的"\n"而不是"換行符"就需要對"\"進行轉義,變成'\\'。

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

正則待匹配字元

匹配結果

說明\n

\nfalse

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

true

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

'\\n'

true

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

r'\n'

true

在字串之前加r,讓整個字串不轉義
貪婪匹配:在滿足匹配時,匹配盡可能長的字串,預設情況下,採用貪婪匹配

正則待匹配字元

匹配結果

說明<.>

......

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

r'\d'

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

學習手扎20190402 異常

程式一旦發生錯誤,就從錯誤的位置停下來了,不在繼續執行後面的內容 使用try和except就能處理異常 try是我們需要處理的 except 後面跟乙個錯誤型別 當 發生錯誤且錯誤型別符合的時候 就會執行except中的 except支援多分支 有沒有乙個能處理所有錯誤的型別 exception 有...

學習手扎20190408 繼承例項

父類中沒有的屬性 在子類 現 叫做派生屬性 父類中沒有的方法 在子類 現 叫做派生方法 只要是子類的物件呼叫,子類中有的名字 一定用子類的,子類中沒有才找父類的,如果父類也沒有報錯 如果父類 子類都有 用子類的 如果還想用父類的,單獨呼叫父類的 父類名.方法名 需要自己傳self引數 super 方...

2019 03 26 學習記錄

今天猶豫是晚上才開始計畫,所以學習的內容較少。熟悉了一下如何使用linkedlist和平衡二叉樹實現簡單的map以及set,並在此基礎上刷了leetcode三道題目 347.top k frequent elements 349.intersection of two arrays 350.inte...