正規表示式入門

2021-10-06 07:31:47 字數 3643 閱讀 7796

正規表示式,又稱規則表示式。(英語:regular

expression,在**中常簡寫為regex、regexp或re),電腦科學的乙個概念。正規表示式通常被用來檢索、替換那些符合某個模式(規則)的文字。

下面是我自己學習的一些總結。這個真的有毒,前段時間學的,最近過年好久沒碰又忘了,想想還是寫一篇筆記記錄一下

元字元

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

\w匹配字母數字下劃線中文

\s匹配空格

\d匹配數字

^匹配字串的開始

$匹配字串的結束

上段**

s ="2222efr43243dsfg4r)_+"

reg1 ="\d" # 匹配全部數字

reg2 ="^\d" # 匹配開頭的數字

print(re.findall(reg2, s))

反義字元:

說白了就是元字元反過來就好了,可以一起記

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

\w 匹配非字母數字下劃線中文

\s 匹配非空格

\d 匹配非數字

限定符

*重複0次到多次

+重複1次到多次

?重複0次到多次

重複n次

重複n次到多次

重複m次到n次

分組匹配1,search:search返回的是乙個匹配物件 ,呼叫物件的group方法獲得字串

s =「my qq is 189334423,my post code is 33332」

reg4 ="(\d.*(\d))"

print(re.search(reg4, s))

group裡面為空或者為1,返回的結果是一樣的

print(re.search(reg4, s).group())

print(re.search(reg4, s).group(1))

print(re.search(reg4, s).group(2))

2, match:匹配開頭

s =「hellohello」

reg5 =「hello」

print(re.match(reg5, s,re.i).group())

總結:

findall匹配所有

match匹配開頭(必須出現在字串第乙個位置)

search匹配第乙個(可以出現任意位置,只要是第乙個就好)

貪婪與非貪婪

貪婪:盡可能多的匹配

非貪婪:盡可能少的匹配

非貪婪符可以用在*,?,+的後面

*? 重複1次

?? 重複0次

+? 重複0次

**如下:

s =「greedyaiiii」

reg1 =「greedyai*」 # 貪婪

print(re.findall(reg1, s)) # 非貪婪

reg2 =「greedyai*?」

print(re.findall(reg2, s))

執行結果為:

[『greedyaiiii』]

[『greedya』]

分支條件匹配**如下:

s =「my phone num=010-11111111 0599-2222222 020-2222222」

reg3 =「0\d-\d|0\d-\d|0\d-\d」

print(re.findall(reg3, s))

執行結果為:

[『010-11111111』, 『0599-2222222』, 『020-2222222』]

捕捉與非捕捉(?:)

非捕捉:不破壞正規表示式的整體性,匹配全部

捕捉:捕捉連續符合正規表示式組內的最後乙個組的內容

現在我們有個需求,需要匹配ip位址

正常情況下,我們這麼寫可以匹配出來

ip ="address code: 128.0.0.1   125.125.125.125     0.0.0.0"

reg4 ="(\d\.)\d"

print(re.findall(reg4, ip))

但是,這裡實際的執行結果為 [『0.』, 『125.』, 『0.』]

原因是當分組時,會自動匹配捕捉模式,捕捉是是連續符合正規表示式組內的最後乙個組的內容,所以這邊匹配的就是每組的第三個

這個時候我們需要用到不捕捉,關鍵字就是 ?:

ip = "address code: 128.0.0.1 125.125.125.125 0.0.0.0"

reg4 = "(?:\d\.)\d"

print(re.findall(reg4, ip))

這樣得出的結果就是:[『128.0.0.1』, 『125.125.125.125』, 『0.0.0.0』]

還有個例子如下:

print(re.findall(reg5, address))零寬斷言

(?=reg) 匹配reg前面的內容

(?<=reg) 匹配reg後面的內容

(?!reg) 匹配後面跟的不是reg的內容

(?例子如下:

s1 ="hellogreedyailove"

reg6 ="helo(?=greedyai)"

print(re.findall(reg6, s1))

這裡匹配的就是greedyai前面的內容,故結果就是hello

reg7="(?<=greedyai)[a-z]*"

print(re.findall(reg7, s1))

這裡匹配的就是greedyai後面的內容,故結果就是hello

reg8="lo(?!greedyai)"

print(re.findall(reg8, s1))

這裡返回的是love裡面的lo,因為匹配的是後面跟著的不是greedyai的內容,前面hello裡的lo後接greedyai

reg9 ="(?

print(re.findall(reg9, s1))

返回的是hello的2個l,因為這裡返回的是l前面不是greedyai的內容,那love裡的l就被排除了

正規表示式 正則入門

先從乙個例子開始正規表示式。書寫乙個匹配手機號的正規表示式,為了方便討論,假定手機號是1開頭,第二位只能是3 5 8中的其中乙個,總共11位的數字,形如13 匹配手機號的正規表示式為 1 358 d 下面介紹此正規表示式中的各個符號的含義。表示字串的開頭,後面緊接著1,表示匹配的字串要以 1 開頭。...

正規表示式入門

對於文字字元,有11個字元被保留作特殊用途。他們是 這些特殊字元也被稱作元字元 不可顯示字元 可以使用特殊字串行來代表某些不可顯示字元 代表tab 0x09 代表回車符 0x0d 代表換行符 0x0a 字符集 字符集是由一對方括號 括起來的字元集合。使用字符集,你可以告訴正規表示式引擎僅僅匹配多個字...

正規表示式入門

老師說過 正規表示式就是用字串讀取字串!學習正規表示式的最好方法是從例子開始,理解例子之後再自己對例子進行修改,實驗。下面給出了不少簡單的例子,並對它們作了詳細的說明。假設你在一篇英文 裡查詢hi,你可以使用正規表示式hi。這幾乎是最簡單的正規表示式了,它可以精確匹配這樣的字串 由兩個字元組成,前乙...