一 . 正則表達式正則表達式
1. 給段字符串判斷是不是手機號碼編程
def aa(str): if len(str)!=11: return False elif str[0]!="1": return False elif str[1:3]!="39" and str[1:3]!="31": return False for i in range(3,11): if str[i]<"0" or str[i]>"9": return False return True age=input("請輸入你的電話號碼:") n=aa(age) print(n)
2. 正則概述編程語言
1. 正則表達式基礎 1.1. 簡單介紹 正則表達式並非Python的一部分。正則表達式是用於處理字符串的強大工具,擁有本身獨特的語法以及一個獨立的處理引擎,效率上可能不如str自帶的方法,但功能十分強大。得益於這一點,
在提供了正則表達式的語言裏,正則表達式的語法都是同樣的,區別只在於不一樣的編程語言實現支持的語法數量不一樣;但不用擔憂,不被支持的語法一般是不經常使用的部分。若是已經在其餘語言裏使用過正則表達式 ,只須要簡單看一看就能夠上手了。 2. re模塊 2.1. 開始使用re Python經過re模塊提供對正則表達式的支持。 使用re的通常步驟是先將正則表達式的字符串形式編譯爲Pattern實例, 而後使用Pattern實例處理文本並得到匹配結果(一個Match實例), 最後使用Match實例得到信息,進行其餘的操做。 import re re.match函數 原型: match(pattern,string,flags=0) pattern :匹配的正則表達式(匹配格式) string :要匹配的字符串 flages : 標誌位 用於控制正則表達式的匹配方式 re.I 忽略大小寫 re.L 作本地戶識別 re.M 多行匹配 影響 ^和$ re.S 是.匹配任意包括換行符在內的全部字符 re.U 根據 Unicode 字符集解析字符 影響 \w \W \b \B re.X 使咱們以更靈活的格式理解正則表達式 參數: 功能:嘗試從字符串的起始位置匹配一個模式若是不是起始位置 成功的話,返回 None re.match() "***********************華麗的分割線***********************************" re.search()函數 原型: reach(pattern,string,flags=0) pattern :匹配的正則表達式(匹配格式) string :要匹配的字符串 flages : 標誌位 用於控制正則表達式的匹配方式 功能: 掃描整個字符串 而且返回第一個成功的匹配 str="my name is love and to bing love" a=re.search("love",str) print(a) "***********************華麗的分割線***********************************" re.findall()函數 原型: findall(pattern,string,flags=0) pattern :匹配的正則表達式(匹配格式) string :要匹配的字符串 flages : 標誌位 用於控制正則表達式的匹配方式 功能: 掃描整個字符串 並返回結果列表 str="my name is love and to bing love" a=re.findall("love",str) print(a) #['love', 'love']
3. 使用簡單的正則match函數
# re.match函數 # 原型: match(pattern,string,flags=0) # pattern :匹配的正則表達式(匹配格式) # string :要匹配的字符串 # flages : 標誌位 用於控制正則表達式的匹配方式 # re.I 忽略大小寫 # re.L 作本地戶識別 # re.M 多行匹配 影響 ^和$ # re.S 是.匹配任意包括換行符在內的全部字符 # re.U 根據 Unicode 字符集解析字符 影響 \w \W \b \B # re.X 使咱們以更靈活的格式理解正則表達式 # 參數: # 功能:嘗試從字符串的起始位置匹配一個模式若是不是起始位置 # 成功的話,返回 None # re.match() import re # 例如:百度網址 a=re.match("www","www.baidu.com") # <_sre.SRE_Match object; span=(0, 3), match='www'> print(a) print("***********************華麗的分割線***********************************") b=re.match("wwW","www.baidu.com") print(b) # None 表示沒有匹配上 print("***********************華麗的分割線***********************************") c=re.match("wwW","www.baidu.com", flags=re.I) print(c) # 不區分大小寫 # <_sre.SRE_Match object; span=(0, 3), match='www'> print("***********************華麗的分割線***********************************") d=re.match("www","www.baidu.com").span() print(d) (0, 3) #能夠獲得匹配的位置
4. 使用簡單正則search工具
# re.search()函數 # 原型: reach(pattern,string,flags=0) # pattern :匹配的正則表達式(匹配格式) # string :要匹配的字符串 # flages : 標誌位 用於控制正則表達式的匹配方式 # 功能: 掃描整個字符串 而且返回第一個成功的匹配 import re str="my name is love and to bing love" a=re.search("love",str) print(a) # <_sre.SRE_Match object; span=(11, 15), match='love'>
5. 使用簡單正則findallurl
# re.findall()函數 # 原型: findall(pattern,string,flags=0) # pattern :匹配的正則表達式(匹配格式) # string :要匹配的字符串 # flages : 標誌位 用於控制正則表達式的匹配方式 # 功能: 掃描整個字符串 並返回結果列表 import re str="my name is love and to bing love" a=re.findall("love",str) print(a) #['love', 'love'] 返回匹配的個數
6. 正則表式元字符spa
import re # . 匹配除換行符之外的任意字符 # [0123456789] []是字符集合 表示匹配方括號中所包含的任意一個字符 # [love] [] 匹配 'l','o','v','e' 中任意字符 # [a-z] 匹配任意小寫字母 # [A-Z] 匹配任意大寫字母 # [0-9] 匹配任意數字 相似: [0123456789] # [0-9a-zA-Z] 匹配任意的數字 字母包括大小寫 # [0-9a-zA-Z_] 匹配任意的數字 字母包括大小寫 和下劃線 # [^love] 匹配除了love 這幾個字母之外的全部字符 # 中括號裏的^稱爲託字符 表示不匹配集合中的字符 # [^0-9] 匹配全部的非數字字符 #\d 匹配全部數字 效果如同[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] str="my name is love and to bing love" a=re.search(".",str) print(a) # <_sre.SRE_Match object; span=(0, 1), match='m'> print("***********************華麗的分割線***********************************") # [0123456789] []是字符集合 表示匹配方括號中所包含的任意一個字符 str="my name is love an6d to bin5g love" b=re.search("[0123456789]",str) print(b) # <_sre.SRE_Match object; span=(19, 20), match='6'> print("***********************華麗的分割線***********************************") # [love] [] 匹配 'l','o','v','e' 中任意字符 str="my name is love and to bing love" c=re.search("[love]",str) print(c) # <_sre.SRE_Match object; span=(6, 7), match='e'>
7. 正則表式元字符 code
import re # . 匹配除換行符之外的任意字符 # [0123456789] []是字符集合 表示匹配方括號中所包含的任意一個字符 # [love] [] 匹配 'l','o','v','e' 中任意字符 # [a-z] 匹配任意小寫字母 # [A-Z] 匹配任意大寫字母 # [0-9] 匹配任意數字 相似: [0123456789] # [0-9a-zA-Z] 匹配任意的數字 字母包括大小寫 # [0-9a-zA-Z_] 匹配任意的數字 字母包括大小寫 和下劃線 # [^love] 匹配除了love 這幾個字母之外的全部字符 # 中括號裏的^稱爲託字符 表示不匹配集合中的字符 # [^0-9] 匹配全部的非數字字符 #\d 匹配全部數字 效果如同[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] str="my name is love and to bing love" a=re.search(".",str) print(a) # <_sre.SRE_Match object; span=(0, 1), match='m'> print("***********************華麗的分割線***************************") # [0123456789] []是字符集合 表示匹配方括號中所包含的任意一個字符 str="my name is love an6d to bin5g love" b=re.search("[0123456789]",str) print(b) # <_sre.SRE_Match object; span=(19, 20), match='6'> print("***********************華麗的分割線***********************************") # [love] [] 匹配 'l','o','v','e' 中任意字符 str="my name is love and to bing love" c=re.search("[love]",str) print(c) # <_sre.SRE_Match object; span=(6, 7), match='e'> print("***********************華麗的分割線***********************************") print("***********************華麗的分割線***********************************") str="my nam9e is lo6ve and 5to bing love" d=re.findall("\d",str) print(d) #['9', '6', '5']
8. re模塊深刻 分組-對象
# 分組: # 除了簡單判斷是否匹配以外 正則表達式還提取子串的功能 用()表示就是提取分組 print("***********************華麗的分割線***********************************") import re str1="010-12345678" m=re.match(r"(\d{3})-(\d{8})",str1) print(m.group(0)) # 010-12345678 print(m.group(1)) # 010 print(m.group(2)) # 12345678 str2="010-12345678" v=re.match(r"(\d{3})-(\d{8})",str2) # 使用序號獲取對應組的信息 group (0) 一隻表明的原始字符串 print(v.group(0)) # 010-12345678 print(v.group(1)) # 010 print(v.group(2)) # 12345678 print(v.groups()) #('010', '12345678') 查看匹配的各組的狀況 print("**RRRR*********************華麗的分割線***********************************") # 編譯: 當咱們使用正則表達式時 re 模塊會幹兩件事 # 1 . 編譯正則表達式 若是正則表達式 自己不合法 會報錯 # 2. 用編譯後的正則表達式去匹配對象 # compile(pattern,flages=0) # pattern :匹配的正則表達式(匹配格式) # a=r"^1(([3578]\d)|(47))\d{8}$" print(re.match(a,"13600000000")) # 編譯正則表對象 re_telephon=re.compile(a) re_telephon.match("13600000000") 正則函數 re.match(pattern,string,flags=0) re模塊 調用 re_telephon.match(string) re 對象調用 re.search(pattern,string,flags=0) re_telephon.search(string) re.findall(pattern,string,flags=0) re_telephon.findall(string) re.finditer(pattern,string,flags=0) re_telephon.finditer(string) re.sub() re_telephon.sub(string) re.subn() re_telephon.subn(string) re.split(pattern,string,maxsplit=0,flags=0) re_telephon.split(string,maxsplit=0)
9. re模塊深刻blog
import re # 正則字符串切割 str1="my name is lover to 哈哈哈" print(str1.split(" ")) # ['my', 'name', 'is', 'lover', 'to', '哈哈哈'] print(re.split(r" +",str1)) # ['my', 'name', 'is', 'lover', 'to', '哈哈哈'] # # # re.finditer函數 # 原型: .finditer(pattern,string,flags=0) # pattern :匹配的正則表達式(匹配格式) # string :要匹配的字符串 # flages : 標誌位 用於控制正則表達式的匹配方式 # # 功能:與fandall 相似掃描整個字符串 返回的是一個迭代器 # str3="my is zhangsan man!my a nice lisi man! my is av ery man" d=re.finditer(r"(my)",str3) while True: try: l=next(d) print(d) except StopIteration as e: break # <callable_iterator object at 0x004F57B0> # <callable_iterator object at 0x004F57B0> # <callable_iterator object at 0x004F57B0> # # re模塊 字符串替換和修改 # sub() 函數 # subn() # 參數:sub(pattern,repl,string,count=0) # subn(pattern,repl,string,count=0) # pattern : 匹配的正則表達式(匹配格式) # repl : 指定的用來替換的字符串 # string : 目標字符串 # count=0 : 最多替換次數 # flages=0 : 標誌位 用於控制正則表達式的匹配方式 # 功能: 在目標字符串中以正則表達式的規則匹配字符串,在把他們替換成指定的字符串 能夠指定替換的次數 若是不指定 就替換全部的匹配字符串 # 區別: # sub() 返回一個被指定替換的字符串 # subn()返回一個元組 第一是替換的字符串 ,第二個元素表被替換的次數 str5="my is a good good man good " print(re.sub(r"(good)","nice",str5)) # my is a nice nice man str6="my is a good good man good and good hao to good" print(re.sub(r"(good)","nice",str6,count=3)) # my is a nice nice man nice and good hao to good print("***********************華麗的分割線***********************************") str6="my is a good good man good " print(re.subn(r"(good)","nice",str6)) print(type(re.subn(r"(good)","nice",str6))) # ('my is a nice nice man nice ', 3) # <class 'tuple'>
10 . 錨字符(邊界字符)
import re # 錨點字符(邊界字符) # ^ :表示行首匹配 和[^]意思不同 # $ : 行尾匹配 # # \A 匹配字符串開始 它和^的區別 是 \A只匹配正個字符串的 # \Z 匹配字符串的結束 它和$的區別是 \Z 只能匹配整個字符串的結束 即便在re.M模式下也不會匹配它的行尾 #開頭,即便在 re.M模式下也不會匹配它行的行首 # \b 匹配一個單詞的邊間 也就是指單詞和空格的位置 # \B 匹配非單詞邊界 str="my name is love and to bing love" a=re.search("love$",str) print(a) # <_sre.SRE_Match object; span=(29, 33), match='love'> str="my name is love and to bing love" b=re.search("^my",str) print(b) # <_sre.SRE_Match object; span=(0, 2), match='my'> print("***********************華麗的分割線***************************") str="my name is love and to bing love\n my 哈哈哈 loer" e=re.findall("^my",str,re.M) print(e) # ['my'] print("***********************華麗的分割線***************************") str="my name is love and to bing love\n my 哈哈哈 love" g=re.findall("love$",str,re.M) print(g) # ['love'] ['love'] str="my name is love and to bing love\n my 哈哈哈 love" f=re.findall("love\Z",str,re.M) print(f) #['love'] print("***********************華麗的分割線***************************") str="my name is love and to bing love my 哈哈哈 love" h=re.search("lo\b",str,re.M) print(h) # None str="my name is love and to bing love my 哈哈哈 love" j=re.search("lo\B",str,re.M) print(j) #<_sre.SRE_Match object; span=(11, 13), match='lo'>
11. 字符匹配多個
import re # zyx n m是假設的 # (xyz) 匹配小括號的xyz (做爲一個總體去匹配) # x? 匹配零個或者多個X # x* 匹配0個或者任意多個x 貪婪匹配 儘量多匹配 # x+ 匹配至少一個x # x{n} 去匹配肯定n個x (n是一個非負數) # x{n,} 匹配至少n個x # x{n,m} 匹配至少n個最多m個x 注意:n<=m # x|Y 匹配的是x或者y print("***********************華麗的分割線***************************") print(re.findall(r"(lover)","my name lover to boy lover")) #['lover'] # ['lover', 'lover'] print("***********************華麗的分割線***************************") print(re.findall(r"o?","my name lover to boy lover")) # [ 'o', '', '', '', '', '', 'o', '', '', 'o', '', '', '', '', 'o', '', '', '', ''] print("***********************華麗的分割線***************************") print(re.findall(r"a*","aaaabbbba")) # ['aaaa', '', '', '', '', 'a', ''] print("***********************華麗的分割線***************************") print(re.findall(r"a+","aaaabbbbaAA")) #['aaaa', 'a'] print("***********************華麗的分割線***************************") print(re.findall(r"a{3}","aaaabbbbaAA"))#['aaa'] print("***********************華麗的分割線***************************") print(re.findall(r"a{3,}","aaaabbbbaAAAAaaaaaaaAA")) #['aaaa', 'aaaaaaa'] print("***********************華麗的分割線***************************") print(re.findall(r"a{3,6}","aaaabbbbaAAAAaaaaaavaaaaaaaaAA")) #['aaaa', 'aaaaaa', 'aaaaaa'] print("***********************華麗的分割線***************************") print(re.findall(r"((l|L)over)","lover=====Lover")) # [('lover', 'l'), ('Lover', 'L')]
12. 練習正則
import re # 需求: srt="my is a good man!my is a niace man! my is a very handsome man" print(re.findall(r"^my(.*?)man$",srt)) print("***********************華麗的分割線***************************") # *? +? x? 最小匹配 一般都是儘量多的匹配 可使用這種能夠解決貪婪模式 (?:x) 相似(xyz) 可是不表示 一個組
13. 練習正則
import re # 給段字符串判斷是不是手機號碼 def aa(str): if len(str)!=11: return False elif str[0]!="1": return False elif str[1:3]!="39" and str[1:3]!="31": return False for i in range(3,11): if str[i]<"0" or str[i]>"9": return False return True age=input("請輸入你的電話號碼:") n=aa(age) print(n) def cc(str): # "13912345678" a=r"^1(([3578]\d)|(47))\d{8}$" res=re.match(a,str) return res print(cc("13912345678"))
14. 練習正則
QQ : 1837855846 mail : loveraa@163.com phone : 010-55348765 user : ip : url : # QQ正則 re_QQ=re.compile(r"^[1-9]\d{5,9}$") print(re_QQ.search("1234567890")) re.compile() 函數 編譯正則表達式模式,返回一個對象。可 以把經常使用的正則表達式編譯成正則表達式對象,方便後續調用及提升效率。