re模塊的高級用法
search
需求:匹配出文章閱讀的次數(shù)
#coding=utf-8 import re ret = re.search(r"d+", "閱讀次數(shù)為 9999") ret.group()
運行結(jié)果
'9999'
findall
需求:統(tǒng)計出Python、c、c++相應(yīng)文章閱讀的次數(shù)
#coding=utf-8 import re ret = re.findall(r"d+", "python = 9999, c = 7890, c++ = 12345") print(ret)
運行結(jié)果:
['9999', '7890', '12345']
sub 將匹配到的數(shù)據(jù)進行替換
需求:將匹配到的閱讀次數(shù)加1
方法1:
#coding=utf-8 import re ret = re.sub(r"d+", '998', "python = 997") print(ret)
運行結(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)
運行結(jié)果:
python = 998 python = 100
練習(xí)
從下面的字符串中取出文本
<div> <p>崗位職責(zé):</p> <p>完成推薦算法、數(shù)據(jù)統(tǒng)計、接口、后臺等服務(wù)器端相關(guān)工作</p> <p><br></p> <p>必備要求:</p> <p>良好的自我驅(qū)動力和職業(yè)素養(yǎng),工作積極主動、結(jié)果導(dǎo)向</p> <p> <br></p> <p>技術(shù)要求:</p> <p>1、一年以上 Python 開發(fā)經(jīng)驗,掌握面向?qū)ο蠓治龊驮O(shè)計,了解設(shè)計模式</p> <p>2、掌握HTTP協(xié)議,熟悉MVC、MVVM等概念以及相關(guān)WEB開發(fā)框架</p> <p>3、掌握關(guān)系數(shù)據(jù)庫開發(fā)設(shè)計,掌握 SQL,熟練使用 MySQL/PostgreSQL 中的一種<br></p> <p>4、掌握NoSQL、MQ,熟練使用對應(yīng)技術(shù)解決方案</p> <p>5、熟悉 JAVAscript/css/html5,JQuery、React、Vue.js</p> <p> <br></p> <p>加分項:</p> <p>大數(shù)據(jù),數(shù)理統(tǒng)計,機器學(xué)習(xí),sklearn,高性能,大并發(fā)。</p> </div>
參考答案:
re.sub(r"<[^>]*>| |n", "", test_str)
split 根據(jù)匹配進行切割字符串,并返回一個列表
需求:切割字符串“info:xiaoZhang 33 shandong”
#coding=utf-8 import re ret = re.split(r":| ","info:xiaoZhang 33 shandong") print(ret)
運行結(jié)果:
['info', 'xiaoZhang', '33', 'shandong']
python貪婪和非貪婪
Python里數(shù)量詞默認(rèn)是貪婪的(在少數(shù)語言里也可能是默認(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ù)字“4”,而“.+”則匹配了從字符串起始到這個第一位數(shù)字4之前的所有字符。
解決方式:非貪婪操作符“?”,這個操作符可以用在"*","+","?"的后面,要求正則匹配的越少越好。
>>> 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;">
請?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ù)編程語言相同,正則表達式里使用"“作為轉(zhuǎn)義字符,這就可能造成反斜杠困擾。假如你需要匹配文本中的字符”",那么使用編程語言表示的正則表達式里將需要4個反斜杠"":前兩個和后兩個分別用于在編程語言里轉(zhuǎn)義成反斜杠,轉(zhuǎn)換成兩個反斜杠后再在正則表達式里轉(zhuǎn)義成一個反斜杠。
Python里的原生字符串很好地解決了這個問題,有了原生字符串,你再也不用擔(dān)心是不是漏寫了反斜杠,寫出來的表達式也更直觀。
>>> ret = re.match(r"c:\a",mm).group() >>> print(ret) c:a