1. 程式人生 > 其它 >正則表示式2

正則表示式2

7個普通元字元

首先介紹的是7個 普通元字元,詳細介紹如下圖,它們在正則表示式中,都有著自己特殊的含義。

1 [ ]符號

案例如下:

importre

str1="acbazbabba6baab"

result1=re.findall("a[a-z]b",str1)①
result2=re.findall("a[0-9]b",str1)②
result3=re.findall("a[za6]b",str1)③

print(result1)
print(result2)
print(result3)

結果如下:程式碼解釋:不管是①②③,表示匹配開頭是a,末尾是b。唯一不同的就是[ ]符號中匹配值不同。

  • ①處表示中間的字元,只要是a-z字母中任何一個,都可以被匹配到。
  • ②處表示中間的字元,只要是0-9數字中任何一個,都可以被匹配到。
  • ③處表示中間的字元,只能是z或a或6這三者中任何一個,才能被匹配到。

2 |或運算子

案例如下:

importre

str2="我是孫悟空,您可以稱呼我為齊天大聖!"

result1=re.findall("孫悟空|齊天大聖",str2)

print(result1)

結果如下:程式碼解釋:要麼匹配孫悟空,要麼匹配齊天大聖。

3 \轉義字元

案例如下:

importre

str3="\n123456"①
str4="\\n123456"②
str5=r"\n123456"③

result3=re.findall("n",str3)
result4=re.findall("n",str4)
result5=re.findall("n",str5)

print(result3)
print(result4)
print(result5)

結果如下:程式碼解釋:觀察①②③處的區別,我們分別注意\的個數和r的用法。

  • ①處一個轉義字元 + 字母n,是一個特殊整體\n,用於表示換行符,因此匹配不到n這個字母。
  • ②處兩個轉義字元 + 字母n,其中\n是一個特殊整體,再加上一個轉義符號\,就將其變為一個普通字母n,因此匹配到了n。
  • ③處其實和②的含義一樣,也可以將特殊整體\n,變為一個普通字母n,因此同樣可以匹配到n。

4 ^和$符號

案例如下:

importre

str6="你來自哪裡?我來自湖北省"

result7=re.findall("^你",str6)
result8=re.findall("^來",str6)

result9=re.findall("省$",str6)
result10=re.findall("湖北$",str6)

print(result7)
print(result8)
print(result9)
print(result10)

結果如下:程式碼解釋:一個用於匹配開頭,一個用於匹配結尾。只有開頭或結尾,與你要匹配的值一致,才能被匹配到。

5 .*?符號

案例如下:

importre

str6="abcdaabb"

result10=re.findall("a.b",str7)①
result11=re.findall("a*b",str7)②
result12=re.findall("a?b",str7)③

result13=re.findall("a.*b",str7)④
result14=re.findall("a.*?b",str7)⑤

print(result10)
print(result11)
print(result12)
print(result13)
print(result14)

結果如下:程式碼解釋:點號一般與*號和?號搭配使用。仔細觀察①-⑤處的正則表示式,開頭和結尾都是a、b,唯一不同的就是它們之間的符號。

  • ①處點號表示匹配(除了換行符)任意單個字元。因此,只要開頭是a,結尾是b,中間是任何一個單個字元,都會被匹配上。
  • ②處*號表示匹配前面一個字元0或多次,在這裡 * 號前面是a。因此,只要結尾是b,前面是>=0個a的值,都會被匹配上。
  • ③處?號表示匹配前面一個字元最多一次,在這裡 * 號前面是a。因此,前面是大一等於0、小於等於1個a的值,都會被匹配上。
  • ④.*組合 ,稱為“貪婪匹配”,是因為它會匹配到儘可能多的內容。原本開頭是a,那麼只要找到b,就是一個返回值。但是貪婪匹配不這樣,他會一直朝後面走,直到找到最後一個b才肯罷休,然後返回一個超級長的字串。
  • ⑤.*?組合 ,稱為“非貪婪匹配”,就是為了制止貪婪匹配而生的。他舅不貪得無厭,只要是開頭是a,你後面不是想要b嗎,我碰到第一個就給你返回了。

6 ( )符號

案例如下:

importre

str8="a321b木頭人c"

result15=re.findall("a(\d+)b([\u4e00-\u9fa5]+)c",str8)

print(result15)

結果如下:程式碼解釋:()表示一個組,只要是()中的內容,最後都會被返回。

6個特殊字元

接著介紹的是6個常用字母,它們與轉義符號搭配,有著自己獨特的含義;

1 \d與\D

案例如下:

importre

str1="123\n黃同學@#%嘻嘻\t"

result1=re.findall("\d",str1)
result2=re.findall("\D",str1)

print(result1)
print(result2)

結果如下:程式碼解釋:\d僅匹配數字,\D用於匹配非數字,很好理解。

2 \s與\S

案例如下:

importre

str2="\r123\n黃同學@#%嘻嘻\t"

result3=re.findall("\s",str2)
result4=re.findall("\S",str2)

print(result3)
print(result4)

結果如下:程式碼解釋:\s僅匹配空白字元,\S用於匹配非空白字元(這個更常用)。

3 \w與\W

案例如下:

importre

str3="\r123\n黃同學_@#%嘻嘻\t"

result5=re.findall("\w",str3)
result6=re.findall("\W",str3)

print(result5)
print(result6)

結果如下:程式碼解釋:\w相當於[A-Za-Z0-9_],超好用(值得注意),\W匹配非單詞字元,瞭解即可。