011 正規表示式

2021-09-30 17:55:50 字數 3512 閱讀 3883

re模組的使用過程

#coding=utf-8

# 匯入re模組

import re

# 使用match方法進行匹配操作

result = re.match(r""正規表示式,""要匹配的字串 )

# 如果上一步匹配到資料的話,可以使用group方法來提取資料

result.group()

re.match() 能夠匹配出以***開頭的字串

匹配單個字元

字元    功能

.    匹配任意1個字元(除了\n)

[ ]    匹配[ ]中列舉的字元

\d    匹配數字,即0-9

\d    匹配非數字,即不是數字

\s    匹配空白,即 空格,tab鍵

\s    匹配非空白

\w    匹配單詞字元,即a-z、a-z、0-9、_

\w    匹配非單詞字元

匹配多個字元

字元    功能

*    匹配前乙個字元出現0次或者無限次,即可有可無

+    匹配前乙個字元出現1次或者無限次,即至少有1次

?    匹配前乙個字元出現1次或者0次,即要麼有1次,要麼沒有

匹配前乙個字元出現m次

匹配前乙個字元出現從m到n次

匹配開頭結尾

字元    功能

^    匹配字串開頭

$    匹配字串結尾

ret=re.match(r"^[a-za-z_0-9]@163\.com$",email)

#如果在正規表示式中需要用熬了某些普通的字元,比如?.等,僅僅需要在他們前面新增乙個反斜槓進行轉義

匹配分組

字元    功能

|    匹配左右任意乙個表示式

(ab)    將括號中字元作為乙個分組

\num    引用分組num匹配到的字串

(?p)    分組起別名

(?p=name)    引用別名為name分組匹配到的字串

re模組的高階用法

search: 不用從頭開始匹配  按著正則去找 

findall:可以找很多個 

sub 將匹配到的資料進行替換(可以替換很多個) 

split 根據匹配進行切割字串,並返回乙個列表

貪婪與非貪婪模式影響的是被量詞修飾的子表示式的匹配行為,貪婪模式在整個表示式匹配成功的前提下,盡可能多的匹配.

非貪婪操作符「?」,這個操作符可以用在"*","+","?"的後面

而非貪婪模式在整個表示式匹配成功的前提下,盡可能少的匹配。

源字串:aa

test1

bbtest2

cc 正規表示式一:.*

匹配結果一:test1

bbtest2

正規表示式二:.*?

匹配結果二:test1

(這裡指的是一次匹配結果,所以沒包括test2

) 根據上面的例子,從匹配行為上分析一下,什是貪婪與非貪婪模式。 

正規表示式一採用的是貪婪模式,在匹配到第乙個「

」時已經可以使整個表示式匹配成功,但是由於採用的是貪婪模式,所以仍然要向右嘗試匹配,檢視是否還有更長的可以成功匹配的子串,匹配到第二個「

」後,向右再沒有可以成功匹配的子串,匹配結束,匹配結果為「test1

bbtest2

」。當然,實際的匹配過程並不是這樣的,後面的匹配原理會詳細介紹。 

僅從應用角度分析,可以這樣認為,貪婪模式,就是在整個表示式匹配成功的前提下,盡可能多的匹配,也就是所謂的「貪婪」,通俗點講,就是看到想要的,有多少就撿多少,除非再也沒有想要的了。

正規表示式二採用的是非貪婪模式,在匹配到第乙個「

」時使整個表示式匹配成功,由於採用的是非貪婪模式,所以結束匹配,不再向右嘗試,匹配結果為「test1

」。 僅從應用角度分析,可以這樣認為,非貪婪模式,就是在整個表示式匹配成功的前提下,盡可能少的匹配,也就是所謂的「非貪婪」,通俗點講,就是找到乙個想要的撿起來就行了,至於還有沒有沒撿的就不管了。

2.1.2 關於前提條件的說明 

在上面從應用角度分析貪婪與非貪婪模式時,一直提到的乙個前提條件就是「整個表示式匹配成功」,為什麼要強調這個前提,我們看下下面的例子。 

正規表示式三:.*

bb 匹配結果三:test1

bb 修飾「.」的仍然是匹配優先量詞「*」,所以這裡還是貪婪模式,前面的「.*

」仍然可以匹配到「test1

bbtest2

」,但是由於後面的「bb」無法匹配成功,這時「.*

」必須讓出已匹配的「bbtest2

」,以使整個表示式匹配成功。這時整個表示式匹配的結果為「test1

bb」,「.*

」匹配的內容為「test1

」。可以看到,在「整個表示式匹配成功」的前提下,貪婪模式才真正的影響著子表示式的匹配行為,如果整個表示式匹配失敗,貪婪模式只會影響匹配過程,對匹配結果的影響無從談起。 

非貪婪模式也存在同樣的問題,來看下面的例子。

正規表示式四:.*?

cc 匹配結果四:test1

bbtest2

cc 這裡採用的是非貪婪模式,前面的「.*?

」仍然是匹配到「test1

」為止,此時後面的「cc」無法匹配成功,要求「.*?

」必須繼續向右嘗試匹配,直到匹配內容為「test1

bbtest2

」時,後面的「cc」才能匹配成功,整個表示式匹配成功,匹配的內容為「test1

bbtest2

cc」,其中「.*?

」匹配的內容為「test1

bbtest2

」。可以看到,在「整個表示式匹配成功」的前提下,非貪婪模式才真正的影響著子表示式的匹配行為,如果整個表示式匹配失敗,非貪婪模式無法影響子表示式的匹配行為。

python中字串前面加上 r 表示原生字串

與大多數程式語言相同,正規表示式裡使用"\"作為轉義字元,這就可能造成反斜槓困擾。

python裡的原生字串很好地解決了這個問題,有了原生字串,你再也不用擔心是不是漏寫了反斜槓,寫出來的表示式也更直觀。

在python的string前面加上『r』, 是為了告訴編譯器這個string是個raw string,不要轉意backslash '\' 。 例如,\n 在raw string中,是兩個字元,\和n, 而不會轉意為換行符。由於正規表示式和 \ 會有衝突,因此,當乙個字串使用了正規表示式後,最好在前面加上'r'。

vim替換命名(末行模式下)

正規表示式 正規表示式 總結

非負整數 d 正整數 0 9 1 9 0 9 非正整數 d 0 負整數 0 9 1 9 0 9 整數 d 非負浮點數 d d 正浮點數 0 9 0 9 1 9 0 9 0 9 1 9 0 9 0 9 0 9 1 9 0 9 非正浮點數 d d 0 0 負浮點數 正浮點數正則式 英文本串 a za z...

正規表示式 表示式

網域名稱 a za z0 9 a za z0 9 a za z0 9 a za z0 9 interneturl a za z s 或 http w w w 手機號碼 13 0 9 14 5 7 15 0 1 2 3 5 6 7 8 9 18 0 1 2 3 5 6 7 8 9 d 號碼 x x x...

Linux正規表示式 編寫正規表示式

為了所有實用化的用途,你可以通過使用程式產生正確的結果。然而,並不意味著程式總是如你所願的那樣正確地工作。多數情況下,如果程式不能產生想要的輸出,可以斷定真正的問題 排除輸入或語法錯誤 在於如何描述想要的東西。換句話說,應該考慮糾正問題的地方是描述想要的結果的表示式。表示式不完整或者公式表示得不正確...