python3筆記二十三:正則表達式之元字符


一:學習內容

  • 匹配單個字符與數字:.、[]、^、\d、\D、\w、\W、\s、\S
  • 匹配錨字符(邊界字符):^、$、\A、\Z、\b、\B
  • 匹配多個字符:(xyz) 、x?、x*、.*、x+、x{n}、x{n,}、x{n,m}、x|y
  • 非貪婪匹配:*?、+?、??、{n,m}?

 

二:匹配單個字符與數字

1.點.:匹配除換行符以外的任意字符

2.[]:是字符集合,表示匹配方括號中所包含的任意一個字符

    [0123456789]   表示匹配任意一個數字
        [0-9]   表示匹配任意一個數字
        [yml]   表示匹配'y','m','l'中任意一個字符
        [a-z]   表示匹配任意一個小寫字符
        [A-Z]   表示匹配任意一個大寫字符
        [0-9a-zA-Z]    表示匹配任意一個數字和字母
        [0-9a-zA-Z_]    表示匹配任意一個數字、字母和下划線

3.^:是脫字符,表示不匹配集合中的字符,注意^在[]中才表示不匹配,在其他位置意義不一樣

        [^test]  表示匹配除了test這幾個字母以外的所有字符
        [^0-9]  表示匹配所有的非數字字符

4.\d:匹配數字,效果同[0-9]

        \d       表示匹配任意一個數字,這里可以不寫[],直接使用\d
        [^\d]   表示匹配所有的非數字字符,效果同[^0-9]

5.\D:匹配非數字字符,效果同[^0-9]

6.\w:匹配數字、字母和下划線,效果同[0-9a-zA-Z]

7.\W:匹配非數字、字母和下划線,效果同[^0-9a-zA-Z]

8.\s:匹配任意的空白符(空格、換行、回車、換頁、制表符),效果同[ \f\n\r\t]

9.\S:匹配任意的非空白符(空格、換行、回車、換頁、制表符),效果同[^ \f\n\r\t]

10.舉例:

print(re.search(".","tester is a good girl!"))  #.可以代表任意字符,所以匹配t,結果匹配一個t
print(re.search("[0123456789]","yml is a good gril 7"))          #匹配結果為數字7
print(re.search("[tester]","tester is a good gril 7"))                 #匹配結果為一個t
print(re.search("[^tester]","tester is a good gril 7"))               #匹配除tester之外的任意一個字符結果為空" "
print(re.search("[^0-9]","tester is a good gril 7"))                   #匹配一個非數字字符結果為t
print(re.search("\d","tester is a good gril 7"))                         #匹配結果為數字7
print(re.search("[^\d]","tester is a good gril 7"))                     #匹配結果為一個t
print(re.search("\D","tester is a good gril 7"))                        #匹配一個非數字字符結果為t
print(re.search("\w","tester is a good gril 7"))                        #匹配任意一個數字字母或下划線,結果為t

print(re.findall(".","_tester is test\nd girl 3"))                          #匹配除換行符以外的任意字符
print(re.findall(".","_tester is test\nd girl 3",flags=re.S))         #匹配包括換行符在內的任意字符

 

三:匹配錨字符(邊界字符)

1.^:行首匹配,注意^在[]中才表示不匹配集合中的字符

2.$:行尾匹配

3.\A:匹配字符串開始,它和^區別是:

  \A只匹配整個字符串的開頭即使在re.M模式下,也不會匹配其他行的行首
       ^匹配的是每行的行首

4.\Z:匹配字符串結束,它和$區別是:

  \Z只匹配整個字符串的結束即使在re.M模式下,也不會匹配其他行的行尾
       $匹配的是每行的行尾

5.\b:匹配一個單詞的邊界,也就是指單詞和空格間的位置

6.\B:匹配非單詞的邊界,也就是指單詞和空格間的位置

7.舉例:

print(re.search("^test","test is a good girl")) #表示行首必須要是test開頭
print(re.search("girl$","test is a good girl")) #表示行尾必須要是girl結尾


print(re.search("\Atest","test is a good girl"))


print(re.findall("^test","test is a good girl\ntest is a good girl",flags=re.M))
print(re.findall("\Atest","test is a good girl\ntest is a good girl",flags=re.M))


print(re.findall("girl$","test is a good girl\ntest is a good girl",flags=re.M))
print(re.findall("girl\Z","test is a good girl\ntest is a good girl",flags=re.M))


print(re.findall(r"er\b","never"))
print(re.findall(r"er\B","never"))
print(re.findall(r"er\b","nerve"))
print(re.findall(r"er\B","nerve"))

 

四:匹配多個字符

說明:下方的x、y、z均為假設的普通字符,n、m為非負整數,不是正則表達式的元字符

1.(xyz):匹配小括號內的內容,()內的內容xyz作為一個整體去匹配

2.x?:匹配0個或者1個x,非貪婪匹配(盡可能少的匹配)

3.x*:匹配0個或者任意多個x,貪婪匹配(盡可能多的匹配)

  .*:表示匹配0個或任意多個字符(換行符除外)

4.x+:匹配至少一個x,貪婪匹配(盡可能多的匹配)

5.x{n}:匹配確定的n個x,n是一個非負整數

6.x{n,}:匹配至少n個x,n是一個非負整數

7.x{n,m}:匹配至少n個最多m個x,注意:n <= m

8.x|y:|表示或,匹配的是x或y

9.舉例:

print(re.findall(r"(test)","test"))
print(re.findall(r"y?","ytesttest"))  #匹配0個或1個
print(re.findall(r"y*","ytesttest"))  #匹配0個或任意多個,貪婪匹配
print(re.findall(r"y+","ytesttest"))  #匹配至少1個,貪婪匹配


print(re.findall(r"y{3}","ytestyyytest"))  #匹配3個y
print(re.findall(r"y{3,}","yytestyyytest"))  #匹配至少3個y
print(re.findall(r"y{3,6}","yytestyyytest"))  #匹配至少3個y,最多6個y


print(re.findall(r"(t|T)est","tttestttttest"))  #匹配t或T
print(re.findall(r"t|Test","tttestttttest"))
print(re.findall(r"((t|T)est)","tttestttttest"))

 

#需求:提取tester......girl
str = "tester is a good girl!tester is a nice girl!tester is a very dddd girl"
print(re.findall(r"tester.*girl",str))
print(re.findall(r"tester.*?girl",str))  #非貪婪

 

五:非貪婪匹配

1.  *?:前一個字符0次或無限次擴展,最小匹配

print(re.findall(r"tes*","tessssssssssssss"))
print(re.findall(r"tes*?","tessssssssssssss"))
print(re.findall(r"tess*","tessssssssssssss"))
print(re.findall(r"tess*?","tessssssssssssss"))

 

2.  +?:前一個字符1次或無限次擴展,最小匹配

print(re.findall(r"tes+","tessssssssssssss"))
print(re.findall(r"tes+?","tessssssssssssss"))
print(re.findall(r"tess+","tessssssssssssss"))
print(re.findall(r"tess+?","tessssssssssssss"))

 

3.  ??:前一個字符0次或1次擴展,最小匹配

print(re.findall(r"tes?","tessssssssssssss"))
print(re.findall(r"tes??","tessssssssssssss"))
print(re.findall(r"tess?","tessssssssssssss"))
print(re.findall(r"tess??","tessssssssssssss"))

 

4.  {n,m}?:擴展前一個字符n到m次,含m,最小匹配

print(re.findall(r"tes{1,2}","tessssssssssssss"))
print(re.findall(r"tesss{1,2}","tessssssssssssss"))
print(re.findall(r"tes{1,2}?","tessssssssssssss"))
print(re.findall(r"tesss{1,2}?","tessssssssssssss"))


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM