python 正則表示式(二) 元字元使用規則
阿新 • • 發佈:2019-01-03
1)----------匹配單個字元與數字------ . -->匹配除換行符以外的任意字元 [] -->[]是字元集合,表示匹配[]中所包含的任意一個字元 [a-z] -->匹配任意小寫字母 [A-Z] -->匹配任意大寫字母 [0-9] -->匹配任意數字,和[0123456789]效果一樣 [0-9a-zA-Z] -->匹配任意的數字和字母 [0-9a-zA-Z_] -->匹配任意的數字、字母和下劃線 [^sun] -->匹配除了sun這三個字元之外的所有字元 ^稱為脫字元,表示不匹配集合中的字元 -->英文輸入模式下,按Shite + 6 \d -->匹配數字,和[0123456789]、[0-9]效果一樣 \D -->匹配非數字字元,和[^0-9]效果一樣 \w -->匹配任意的數字、字母和下劃線,效果同[0-9a-zA-Z_] \W -->匹配非數字、字母和下劃線,效果同[^0-9a-zA-Z_] \s -->匹配任意的空白符(空格,換行,回車,換頁,指標),效果同[ \f\n\r\t] \S -->匹配任意的非空白符(空格,換行,回車,換頁,指標),效果同[^ \f\n\r\t] 2)----------錨字元(邊界字元)------ ^ -->行首匹配,和在[]中使用^時效果不同 $ -->行尾匹配 \A -->只匹配字串開始,它和^的區別時:\A只匹配整個字串的開頭, 即便在re.M模式下,也不會匹配其它行的行首 \Z -->只匹配字串結尾,它和$的區別時:\Z只匹配整個字串的結尾, 即便在re.M模式下,也不會匹配其它行的行尾 \b -->匹配一個單詞(\b的位置就是單詞結束的位置) \B -->匹配非單詞邊界 3)----------匹配多個字元------ 說明:下方的x,y,z均為假設的普通字元,不具有特殊一樣 (xyz) -->匹配小括號內的xyz(作為一個整體) x? -->匹配0個或者一個x 非貪婪匹配(儘可能少的匹配) x* -->匹配0個或者任意多個x 貪婪匹配(儘可能多的匹配) x+ -->匹配至少一個x x{n} -->匹配確定的n個x(n事一個非負整數) x{n,} -->匹配至少n個x(n事一個非負整數) x{n,m} n <= 匹配個數 <=m (匹配n個到m個x) x|y -->表示或,匹配的是x或y 4)----------特殊------ *? +? x? 最小匹配 通常都是儘可能多的匹配,可以使用這種解決貪婪匹配 對於str = "start part1 stop start part2 stop start part3 stop" 如果用r"start.*stop",則是貪婪匹配 .*儘可能匹配的長一些,匹配結果就是最長的一串 ['start part1 stop start part2 stop start part3 stop'] 而如果用r"start.*?stop",則是貪婪匹配 .*?儘可能匹配的短一些,匹配結果就是所有的短串 ['start part1 stop', 'start part2 stop', 'start part3 stop'] 5)匹配的內容中包含有正則表示式的元字元怎麼辦? 如 str = "2*3=6",想要匹配2*,以及其位置spen,使用r"2*"是不行的 使用\*將*作為普通字元,不作為正則表示式的元字元,r"2\*"
#手機號碼匹配:r"^1(([3578]\d)|(47))\d{8}$" #如果是在字串中查詢,則r"1(([3578]\d)|(47))\d{8}",去掉首尾限制 lstr = ["1321234567","13212345678","132123456780","1321234567a", "23212345678","14712345678"] for ss in lstr: print(re.search(r"^1(([3578]\d)|(47))\d{8}$",ss)) #demo1 練習使用. # 匹配.n print(re.search(".n","the sun is shine")) #匹配到第一個符合的字串"un" #demo2 練習使用[] #找到一個字串中的所有數字 listNum = re.findall("[1234567890]","t1od3ay is goo4d t1y5i2") print(listNum) #demo 練習使用行首匹配^ print(re.search("^sun","the sun is shine"))#不能匹配到,因為sun不在行首 print(re.search("^sun","sun,the sun is shine"))#能匹配到,因為sun在行首 #demo 練習使用\A 前面加'r',以防其中包含轉義字元 print(re.findall("^the","the sun is shine\nthe sun is shine\nthe sun is shine\n",re.M)) print(re.findall(r"\Athe","the sun is shine\nthe sun is shine\nthe sun is shine\n",re.M)) #demo 練習使用\b 前面加'r',以防其中包含轉義字元 #能找到前三個sun,他們以' '及','為邊界結尾,sune也包含了sun,但不能找到 print(re.findall(r"sun\b","sun the sun is sun,sune")) #demo 練習使用\B 前面加'r',以防其中包含轉義字元 #只找到一個sun print(re.findall(r"sun\B","sun the sun is sun,sune")) #改用search函式,發現spen =(19,22),就是sune的位置 print(re.search(r"sun\B","sun the sun is sun,sune")) #demo print(re.findall(r"s+","sun the ssn is sss,sune")) #demo print(re.findall(r"s{3}","sun the ssn is sss,sune")) #demo print(re.findall(r"s{2,}","sun the ssn is sss,sune")) #demo print(re.findall(r"s{1,2}","sun the ssn is sss,sune")) #demo print(re.findall(r"((s|S)un)","sun the ssn is sss,Sune")) # 提取 sun...day str = "sun the ssn is sss,Sune,today" print(re.findall(r"^sun.*day$",str)) str2 ="start part1 stop start part2 stop start part3 stop" print(re.findall(r"start.*stop",str2)) str2 ="start part1 stop start part2 stop start part3 stop" print(re.findall(r"start.*?stop",str2)) str3 = "2*3=6" print(re.search(r"2*",str3)) #只能找到2,而不能找到2* print(re.search(r"2\*",str3)) #\*將*作為普通字元,不作為正則表示式的元字元