正则不以什么开头_python基础 | 正则扫盲
圖|一張顧巷
文|一張顧巷
門徑初窺
//正則:交個朋友?//鴿 ?了大家好久的正則,今天終于來啦~~朋友:誰是正則啊?那就由正則本人來一個官方的自我介紹。(旁白)正則:俺大名,正則表達式;洋名,Regular Expression。是一個根據「特定語法結構編寫」的正經字符串。朋友:那你有啥本領呀?正則:字符串的檢索、替換及匹配驗證都離不開我~朋友:耍個瞧瞧噻。正則:嗐,說來就來,您瞧好,咱先來個簡單的,從下述字符串中提取手機號碼兔子小白將寫了13451817705的字條悄咪咪藏好朋友:要怎么提取?遍歷字符串一個個字符判斷?正則:duck不必,只需下述一串字符串:"(?朋友:正則:交個朋友?//在線小工具分享//隨手打開一個在線正則測試工具,復制粘貼:https://tool.oschina.net/regex/點擊測試匹配后,可以看到手機號碼已被提取出來了,強大如斯,看不懂上述表達式?沒關系,往下看Python中正則的詳細用法。明其所以
//re模塊//Python中內置re模塊用來處理正則表達式,上述在線測試的例子可以寫成Python代碼:import?rereg_string =?'兔子小白將寫了13451817705的字條悄咪咪藏好'reg =?'(?result = re.search(reg, reg_string)print(result)# 輸出:# <_sre.sre_match object span="(7," match="13451817705">上述用到的search()函數是re模塊提供的正則匹配函數,一一介紹下re模塊提供的幾個常用函數~//常用函數//匹配
re.match(pattern, string, flags=0)
嘗試從字符串的開頭進行匹配,匹配成功返回匹配對象,否則返回Nonere.search(pattern, string, flags=0)掃描整個字符串,返回第一個匹配對象,否則返回None檢索與替換
re.findall(pattern, string, flags=0)
掃描整個字符串,匹配所有能匹配的對象,以列表形式返回
re.finditer(pattern, string, flags=0)
同findall,匹配所有能匹配的對象,但是是以迭代器形式返回
re.sub(pattern, repl, string, count=0, flags=0)
將匹配的字符串替換為其他字符串,count為替換的最大次數,默認為0,替換所有
re.split(pattern, string, maxsplit=0, flags=0)
將匹配的字符串進行分割,返回列表,maxsplit為分割的最大次數,默認為0,分割所有
編譯Pattern對象
對于多次用的正則表達式,可調用compile()函數將正則表達式編譯成Pattern對象,調用時直接Pattern對象.xxx即可,以此提高復用性
flags修飾符
在調用這些常用函數時,可傳入flags參數(標志位修飾符),來控制匹配模式,有下表這些可供選擇,如果想同時選擇多個使用運算符"|"進行連接,比如:re.I|re.M
| 修飾符 | 描述 |
| re.I | IGNORECASE?→ 忽略大小寫 |
| re.M | MULTILINE?→ 多行匹配,影響^和$ |
| re.S | DOTALL?→ 使.匹配包括換行在內的所有字符 |
| re.X | VERBOSE?→ 忽略空白和注釋,并允許使用'#'來引導一個注釋 |
| re.U | UNICODE?→ 根據Unicode字符集解析字符,影響\w、\W、\b和\B |
| re.L | LOCALE?→ 做本地化識別(locale-aware)匹配 |
正則語法詳解
//'r'知多少//用于告知編譯器這個string是raw string(原始字符串),不要轉義反斜杠,比如r'\n'是兩個字符:反斜杠+n,而不是換行!//轉義少不了//當遇到用于正則匹配模式的特殊字符時,在前面加反斜線轉義一下即可,比如\.,\(,\)等。//字符規則//
| ??字符? ? | 作用 |
| . | 匹配任意一個字符(除\n外) |
| [...] | 匹配[]中列舉的字符 |
| [^...] | 匹配不在[]中列舉的字符 |
| \d | 匹配數字,0-9 |
| \D | 匹配非數字 |
| \s | 匹配空白,即空白與tab縮進 |
| \S | 匹配非空白 |
| \w | 匹配字母數字或下劃線,a-z,A-Z,0-9,_ |
| \W | 匹配非字母數字或下劃線 |
| - | 匹配范圍,如a-f |
//邊界規則//
| 字符 | 作用 |
| ^ | 行開始 |
| $ | 行結束 |
| \b | 單詞邊界,即單詞和空格間的位置,如'er\b'可匹配'never'中的'er',但不能匹配'verb'中的'er' |
| \B | 匹配非單詞邊界 |
| \A | 匹配字符串開頭 |
| \Z | 匹配字符串結尾,如果有換行,只匹配到換行前的結束字符串 |
| \z | 匹配字符串結尾,如果有換行,會連換行符也匹配 |
//分組//
有時我們需要的可能是匹配字符串中的一部分內容,可以進行分組,使用括號()包裹,比如:從匹配的字符串中提取出區號和本地號碼 → ^(\d{3})-(\d{3,8})$,具體規則如下表所示:
| 字符 | 作用 |
| l | 匹配左右任意一個表達式 |
| (re) | 匹配括號內的表達式,也表示一個組 |
| (?:re) | 同上,但不表示一個組 |
(?=re)→前向肯定斷言,僅當子表達式在此位置的右側匹配時才繼續匹配,如:ok(?=fu) ,與以fu結尾的ok實例匹配。
(?!re)→前向否定斷言,僅當子表達式不在此位置的右側匹配時才繼續匹配,如:(?!fu) 與不以fu結尾的實例匹配,所以與okfu不匹配。
(?<=re)→后向肯定斷言,僅當子表達式在此位置的左側匹配時才繼續匹配,如:(?=ok)fu 與跟在ok后的fu實例匹配。
(?不以ok開頭的實例匹配,所以與okfu不匹配。
re中的group()函數也可以獲取帶每個匹配的分組內容:
import rereg_pattern = re.match(r'^(\d{4})-(\d{3,8})$', '0756-1234567')print(reg_pattern.group())print(reg_pattern.group(0))print(reg_pattern.group(1))print(reg_pattern.group(2))# 輸出:# 0756-1234567# 0756-1234567# 0756# 1234567此外,還有四個常用函數:groups():從group(1)開始往后的所有值,返回一個元組
start():返回匹配的開始位置
end():返回匹配的結束位置
span():返回一個元組,表示匹配位置(開始,結束)
//貪婪匹配和非貪婪匹配//
正則匹配默認是貪婪匹配,即匹配盡可能多的字符。若需要匹配符合表達式盡可能少的字符串,則可以合理使用” ?“,采用非貪婪匹配。
import rere.match(r'^(\d+)(0*)$','12345000').groups()#?原意是想得到('12345', '000')這樣的結果的,但輸出的卻是:('12345000', '')#?由于貪婪匹配,直接把后面的0都給匹配了,結果0*只能匹配空字符串了,# 若果想盡可能少的匹配,可在\d+后加上一個問號?,采用非貪婪匹配re.match(r'^(\d+?)(0*)$','12345000').groups()# 輸出結果:('12345', '000')//常用正則收錄//
參考https://juejin.cn/post/6844904182835757064# 火車車次[GCDZTSPKXLY1-9]\d{1,4}# 手機機身碼(IMEI)\d{15,17}# 必須帶端口號的網址(或ip)((ht|f)tps?:\/\/)?[\w-]+(\.[\w-]+)+:\d{1,5}\/?# 統一社會信用代碼[0-9A-HJ-NPQRTUWXY]{2}\d{6}[0-9A-HJ-NPQRTUWXY]{10}# 子網掩碼 (?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])(?:\.(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])){3}# 網址(url,支持端口和"?+參數"和"#+參數)((ht|f)tps?://)?[\w-]+(\.[\w-]+)+([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?# 24小時制時間(HH:mm:ss)(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d# 12小時制時間(hh:mm:ss)(?:1[0-2]|0?[1-9]):[0-5]\d:[0-5]\d# date(日期)\d{4}(-)(1[0-2]|0?\d)\1([0-2]\d|\d|30|31)# email(郵箱)(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))# 匹配連續重復的字符(.)\1+# 銀行卡號(10到30位, 覆蓋對公/私賬戶, 參考微信支付)[1-9]\d{9,29}# 手機號(mobile phone)中國(嚴謹), 根據工信部2019年最新公布的手機號段(?:(?:\+|00)86)?1(?:(?:3[\d])|(?:4[5-7|9])|(?:5[0-3|5-9])|(?:6[5-7])|(?:7[0-8])|(?:8[\d])|(?:9[1|8|9]))\d{8}雖遲但到,希望對你們有幫助,比心心~
總結
以上是生活随笔為你收集整理的正则不以什么开头_python基础 | 正则扫盲的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HTML中hr和br是什么意思
- 下一篇: python pygame鼠标点击_Py