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