Python全棧之路正則函數(shù)
1. 反向引用_命名分組
# ### 反向引用
import re
strvar = "<div>明天又要休息了</div>"
obj = re.search("<(.*?)>(.*?)<(.*?)>",strvar)
print(obj)
# 獲取匹配到的內(nèi)容
res1 = obj.group()
print(res1)
# 獲取分組里的內(nèi)容
res2 = obj.groups()
print(res2)
# 反向引用的語(yǔ)法 \1把第一個(gè)括號(hào)里面匹配到的內(nèi)容在引用一次
obj = re.search(r"<(.*?)>(.*?)</\1>",strvar)
print(obj)
print(obj.group())
print(obj.groups())
strvar = " z3d4pzd a1b2cab "
obj = re.search(r"(.*?)\d(.*?)\d(.*?)\1\2",strvar)
print(obj)
print(obj.group())
print(obj.groups())
# ### 命名分組
"""
3) (?P<組名>正則表達(dá)式) 給這個(gè)組起一個(gè)名字
4) (?P=組名) 引用之前組的名字,把該組名匹配到的內(nèi)容放到當(dāng)前位置
"""
# 寫(xiě)法一
strvar = " z3d4pzd a1b2cab "
obj = re.search(r"(?P<tag1>.*?)\d(?P<tag2>.*?)\d(?P<tag3>.*?)\1\2",strvar)
print(obj)
print(obj.group())
# 寫(xiě)法二
strvar = " z3d4pzd a1b2cab "
obj = re.search(r"(?P<tag1>.*?)\d(?P<tag2>.*?)\d(?P<tag3>.*?)(?P=tag1)(?P=tag2)",strvar)
print(obj)
print(obj.group())
2. 正則函數(shù)
# ### 正則函數(shù)
import re
# search 通過(guò)正則匹配出第一個(gè)對(duì)象返回,通過(guò)group取出對(duì)象中的值
strvar = "3+4 6*4"
obj = re.search(r"(\d+[+*]\d+)",strvar)
print(obj)
# 獲取匹配到的內(nèi)容
print(obj.group())
# 獲取分組當(dāng)中的內(nèi)容 (返回元組)
print(obj.groups())
# match 驗(yàn)證用戶輸入內(nèi)容 (了解)
"""search在正則表達(dá)式的前面加上^ 等價(jià)于 match ,其他用法上一模一樣"""
strvar = "a17366668888"
strvar = "17366668888"
# obj = re.search(r"^\d+",strvar)
# obj = re.match(r"\d+",strvar)
# print(obj.group())
print(obj)
# split 切割
strvar = "alex|wusir_xboyww@risky"
lst = re.split("[|_@]",strvar)
print(lst)
strvar = "alex2341273894wusir234234xboyww11111risky"
lst = re.split("\d+",strvar)
print(lst)
# sub 替換
strvar = "alex|wusir_xboyww@risky"
"""
strvar = strvar.replace("|","&")
strvar = strvar.replace("_","&")
strvar = strvar.replace("@","&")
print(strvar)
"""
# sub(正則,替換的字符,原字符串[,替換的次數(shù)])
res = re.sub("[|_@]","&",strvar)
res = re.sub("[|_@]","&",strvar,1)
print(res)
# subn 替換 (用法上與sub相同,只是返回值不同)
res = re.subn("[|_@]","&",strvar)
res = re.subn("[|_@]","&",strvar,2)
print(res)
# res = re.sub("[|_@]","&",strvar)
# ('alex&wusir&xboyww@risky', 2)
# finditer 匹配字符串中相應(yīng)內(nèi)容,返回迭代器
"""返回的是迭代器,迭代器中包含了對(duì)象 對(duì)象.group來(lái)獲取匹配到的值"""
from collections import Iterator, Iterable
strvar = "sdf23647fdgdfg()*()*23423423"
it = re.finditer("\d+",strvar)
print(isinstance(it,Iterator))
for obj in it:
print(obj.group())
# compile 指定一個(gè)統(tǒng)一的匹配規(guī)則
"""
正常情況下,正則表達(dá)式編譯一次,執(zhí)行一次
為了避免反復(fù)編譯,節(jié)省時(shí)間空間,可以使用compile統(tǒng)一規(guī)則
編譯一次,終身受益
"""
strvar = "asdfs234sdf234"
pattern = re.compile("\d+")
print("<===>")
obj = pattern.search(strvar)
print(obj.group())
lst = pattern.findall(strvar)
print(lst)
# 修飾符
# re.I 使匹配對(duì)大小寫(xiě)不敏感
strvar = "<h1>大標(biāo)題</H1>"
pattern = re.compile("<h1>(.*?)</h1>" , flags=re.I)
obj = pattern.search(strvar)
print(obj.group())
# re.M 使每一行都能夠單獨(dú)匹配(多行匹配),影響 ^ 和 $
"""單行獨(dú)立匹配,而不是整體匹配"""
strvar = """
<p>111</p>
<a>222</a>
<strong>333</strong>
"""
pattern = re.compile("^<.*?>(?:.*?)<.*?>$" , flags=re.M)
lst = pattern.findall(strvar)
print(lst)
# re.S 使 . 匹配包括換行在內(nèi)的所有字符
strvar = """
give
sdfsdfmefive
"""
# 多個(gè)修飾符一起使用通過(guò)|拼接
pattern = re.compile(".*?mefive" , flags = re.S|re.I|re.M )
obj = pattern.search(strvar)
print(obj.group())
小提示:
爬蟲(chóng)爬數(shù)據(jù)的時(shí)候用finditer,數(shù)據(jù)太大,用迭代器存
strvar = """
<p>111</p>
<a>222</a>
<strong>333</strong>
"""
pattern = re.compile("^<.*?>(?:.*?)<.*?>$")
lst = pattern.findall(strvar)
print(lst) # 這里的結(jié)果為[] 因?yàn)?不匹配換行符,所以不會(huì)返回結(jié)果
pattern = re.compile("^<.*?>(?:.*?)<.*?>$",flags=re.M) 這里就是
一行的一行的匹配了
不會(huì)用for i in找思路
不會(huì)用.*?找思路
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
- Python常用正則函數(shù)使用方法詳解
- python正則表達(dá)式函數(shù)match()和search()的區(qū)別
- Python常用的正則表達(dá)式處理函數(shù)詳解
- 一文秒懂python正則表達(dá)式常用函數(shù)
- Python編程快速上手——strip()函數(shù)的正則表達(dá)式實(shí)現(xiàn)方法分析
- Python3正則匹配re.split,re.finditer及re.findall函數(shù)用法詳解
- Python3中正則模塊re.compile、re.match及re.search函數(shù)用法詳解
- 關(guān)于Python正則表達(dá)式 findall函數(shù)問(wèn)題詳解
相關(guān)文章
python爬蟲(chóng)lxml庫(kù)解析xpath網(wǎng)頁(yè)過(guò)程示例
這篇文章主要為大家介紹了python爬蟲(chóng)lxml庫(kù)解析xpath網(wǎng)頁(yè)的過(guò)程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
caffe的python接口deploy生成caffemodel分類新的圖片
這篇文章主要為大家介紹了caffe的python接口生成deploy文件學(xué)習(xí)以及用訓(xùn)練好的模型(caffemodel)來(lái)分類新的圖片示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
python 如何用urllib與服務(wù)端交互(發(fā)送和接收數(shù)據(jù))
這篇文章主要介紹了python 如何用urllib與服務(wù)端交互(發(fā)送和接收數(shù)據(jù)),幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下2021-03-03
Python實(shí)現(xiàn)修改IE注冊(cè)表功能示例
這篇文章主要介紹了Python實(shí)現(xiàn)修改IE注冊(cè)表功能,結(jié)合完整實(shí)例形式分析了Python操作IE注冊(cè)表項(xiàng)的相關(guān)實(shí)現(xiàn)技巧與注意事項(xiàng),需要的朋友可以參考下2018-05-05
python設(shè)置 matplotlib 正確顯示中文的四種方式
這篇文章主要介紹了python設(shè)置 matplotlib 正確顯示中文的四種方式,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下2021-05-05
Python實(shí)現(xiàn)定時(shí)任務(wù)的八種方案詳解
在日常工作中,我們常常會(huì)用到需要周期性執(zhí)行的任務(wù),我們可以用Python直接實(shí)現(xiàn)這一功能。本文整理的是常見(jiàn)的Python定時(shí)任務(wù)的八種實(shí)現(xiàn)方式,需要的朋友可以參考一下2022-02-02
Python制作簡(jiǎn)易版小工具之計(jì)算天數(shù)的實(shí)現(xiàn)思路
這篇文章主要介紹了Python制作簡(jiǎn)易版小工具之計(jì)算天數(shù)的實(shí)現(xiàn)思路,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02
Python圖像文字識(shí)別詳解(附實(shí)戰(zhàn)代碼)
這篇文章主要給大家介紹了關(guān)于Python圖像文字識(shí)別的相關(guān)資料,本文介紹使用python進(jìn)行圖像的文字識(shí)別,將圖像中的文字提取出來(lái),可以幫助我們完成很多有趣的事情,需要的朋友可以參考下2024-02-02
Django shell調(diào)試models輸出的SQL語(yǔ)句方法
今天小編就為大家分享一篇Django shell調(diào)試models輸出的SQL語(yǔ)句方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08

