re模塊的高級(jí)用法
search
需求:匹配出文章閱讀的次數(shù)
#coding=utf-8 import re ret = re.search(r"d+", "閱讀次數(shù)為 9999") ret.group()
運(yùn)行結(jié)果
'9999'
findall
需求:統(tǒng)計(jì)出Python、c、c++相應(yīng)文章閱讀的次數(shù)
#coding=utf-8 import re ret = re.findall(r"d+", "python = 9999, c = 7890, c++ = 12345") print(ret)
運(yùn)行結(jié)果:
['9999', '7890', '12345']
sub 將匹配到的數(shù)據(jù)進(jìn)行替換
需求:將匹配到的閱讀次數(shù)加1
方法1:
#coding=utf-8 import re ret = re.sub(r"d+", '998', "python = 997") print(ret)
運(yùn)行結(jié)果:
python = 998
方法2:
#coding=utf-8 import re def add(temp): strNum = temp.group() num = int(strNum) + 1 return str(num) ret = re.sub(r"d+", add, "python = 997") print(ret) ret = re.sub(r"d+", add, "python = 99") print(ret)
運(yùn)行結(jié)果:
python = 998 python = 100
練習(xí)

從下面的字符串中取出文本
<div> <p>崗位職責(zé):</p> <p>完成推薦算法、數(shù)據(jù)統(tǒng)計(jì)、接口、后臺(tái)等服務(wù)器端相關(guān)工作</p> <p><br></p> <p>必備要求:</p> <p>良好的自我驅(qū)動(dòng)力和職業(yè)素養(yǎng),工作積極主動(dòng)、結(jié)果導(dǎo)向</p> <p> <br></p> <p>技術(shù)要求:</p> <p>1、一年以上 Python 開發(fā)經(jīng)驗(yàn),掌握面向?qū)ο蠓治龊驮O(shè)計(jì),了解設(shè)計(jì)模式</p> <p>2、掌握HTTP協(xié)議,熟悉MVC、MVVM等概念以及相關(guān)WEB開發(fā)框架</p> <p>3、掌握關(guān)系數(shù)據(jù)庫(kù)開發(fā)設(shè)計(jì),掌握 SQL,熟練使用 MySQL/PostgreSQL 中的一種<br></p> <p>4、掌握NoSQL、MQ,熟練使用對(duì)應(yīng)技術(shù)解決方案</p> <p>5、熟悉 JAVAscript/css/html5,JQuery、React、Vue.js</p> <p> <br></p> <p>加分項(xiàng):</p> <p>大數(shù)據(jù),數(shù)理統(tǒng)計(jì),機(jī)器學(xué)習(xí),sklearn,高性能,大并發(fā)。</p> </div>
參考答案:
re.sub(r"<[^>]*>| |n", "", test_str)
split 根據(jù)匹配進(jìn)行切割字符串,并返回一個(gè)列表
需求:切割字符串“info:xiaoZhang 33 shandong”
#coding=utf-8 import re ret = re.split(r":| ","info:xiaoZhang 33 shandong") print(ret)
運(yùn)行結(jié)果:
['info', 'xiaoZhang', '33', 'shandong']
python貪婪和非貪婪
Python里數(shù)量詞默認(rèn)是貪婪的(在少數(shù)語(yǔ)言里也可能是默認(rèn)非貪婪),總是嘗試匹配盡可能多的字符;
非貪婪則相反,總是嘗試匹配盡可能少的字符。
在"*","?","+","{m,n}"后面加上?,使貪婪變成非貪婪。
>>> s="This is a number 234-235-22-423" >>> r=re.match(".+(d+-d+-d+-d+)",s) >>> r.group(1) '4-235-22-423' >>> r=re.match(".+?(d+-d+-d+-d+)",s) >>> r.group(1) '234-235-22-423' >>>
正則表達(dá)式模式中使用到通配字,那它在從左到右的順序求值時(shí),會(huì)盡量“抓取”滿足匹配最長(zhǎng)字符串,在我們上面的例子里面,“.+”會(huì)從字符串的啟始處抓取滿足模式的最長(zhǎng)字符,其中包括我們想得到的第一個(gè)整型字段的中的大部分,“d+”只需一位字符就可以匹配,所以它匹配了數(shù)字“4”,而“.+”則匹配了從字符串起始到這個(gè)第一位數(shù)字4之前的所有字符。
解決方式:非貪婪操作符“?”,這個(gè)操作符可以用在"*","+","?"的后面,要求正則匹配的越少越好。
>>> re.match(r"aa(d+)","aa2343ddd").group(1) '2343' >>> re.match(r"aa(d+?)","aa2343ddd").group(1) '2' >>> re.match(r"aa(d+)ddd","aa2343ddd").group(1) '2343' >>> re.match(r"aa(d+?)ddd","aa2343ddd").group(1) '2343' >>>
練一練

字符串為:
<img data-original="https://rpic.douyucdn.cn/AppCovers/2016/11/13/1213973_201611131917_small.jpg" src="https://rpic.douyucdn.cn/appCovers/2016/11/13/1213973_201611131917_small.jpg" style="display: inline;">
請(qǐng)?zhí)崛rl地址
參考答案
re.search(r"https://.*?.jpg", test_str)
r的作用
>>> mm = "c:\a\b\c" >>> mm 'c:\a\b\c' >>> print(mm) c:abc >>> re.match("c:\\",mm).group() 'c:\' >>> ret = re.match("c:\\",mm).group() >>> print(ret) c: >>> ret = re.match("c:\\a",mm).group() >>> print(ret) c:a >>> ret = re.match(r"c:\a",mm).group() >>> print(ret) c:a >>> ret = re.match(r"c:a",mm).group() Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'NoneType' object has no attribute 'group' >>>
說明
Python中字符串前面加上 r 表示原生字符串,
與大多數(shù)編程語(yǔ)言相同,正則表達(dá)式里使用"“作為轉(zhuǎn)義字符,這就可能造成反斜杠困擾。假如你需要匹配文本中的字符”",那么使用編程語(yǔ)言表示的正則表達(dá)式里將需要4個(gè)反斜杠"":前兩個(gè)和后兩個(gè)分別用于在編程語(yǔ)言里轉(zhuǎn)義成反斜杠,轉(zhuǎn)換成兩個(gè)反斜杠后再在正則表達(dá)式里轉(zhuǎn)義成一個(gè)反斜杠。
Python里的原生字符串很好地解決了這個(gè)問題,有了原生字符串,你再也不用擔(dān)心是不是漏寫了反斜杠,寫出來的表達(dá)式也更直觀。
>>> ret = re.match(r"c:\a",mm).group() >>> print(ret) c:a