深入淺析正則表達(dá)式re模塊(部分)
正則表達(dá)式:
官方定義:正則表達(dá)式是對(duì)字符串操作的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個(gè)“規(guī)則字符串”,這個(gè)“規(guī)則字符串”用來(lái)表達(dá)對(duì)字符串的一種過(guò)濾邏輯。
什么是正則表達(dá)式: 一套規(guī)則 - 匹配字符串的
談到正則,就只和字符串相關(guān)了。我們要考慮的是在同一個(gè)位置上可以出現(xiàn)的字符的范圍。
正則表達(dá)式能做什么:
•1.檢測(cè)一個(gè)輸入的字符串是否合法 -- web開(kāi)發(fā)項(xiàng)目 表單驗(yàn)證 ◦用戶輸入一個(gè)內(nèi)容的時(shí)候,我們要提前做檢測(cè)
◦能夠提高程序的效率并且減輕服務(wù)器的壓力
•2.從一個(gè)大文件中找到所有符合規(guī)則的內(nèi)容 -- 日志分析\爬蟲(chóng) ◦能夠高效的從一大段文字中快速找到符合規(guī)則的內(nèi)容
字符組 : [字符組]
在同一個(gè)位置可能出現(xiàn)的各種字符組成了一個(gè)字符組,在正則表達(dá)式中用[]表示。一個(gè)中括號(hào)只表示一個(gè)字符位置
字符分為很多類,比如數(shù)字、字母、標(biāo)點(diǎn)等等。假如你現(xiàn)在要求一個(gè)位置"只能出現(xiàn)一個(gè)數(shù)字",那么這個(gè)位置上的字符只能是0、1、2...9這10個(gè)數(shù)之一。
字符組 描述的是一個(gè)位置上能出現(xiàn)的所有可能性
# 接受范圍,可以描述多個(gè)范圍,連著寫(xiě)就可以了
# [abc] 一個(gè)中括號(hào)只表示一個(gè)字符位置,匹配a或者b或者c
# [0-9] 匹配數(shù)字0-9,根據(jù)ASCII進(jìn)行范圍的比對(duì)
# [a-z] 匹配所有的小寫(xiě)字母
# [A-Z] 匹配所有的大寫(xiě)字母
# [a-zA-Z] 匹配所有的大小寫(xiě)字母
# [0-9a-z]
# [0-9a-zA-Z_]
元字符:
字符:
元字符 匹配內(nèi)容的規(guī)則
. 匹配除換行符以外的任意字符
\w 匹配字母或數(shù)字或下劃線
\s 匹配任意的空白符
\d 匹配數(shù)字
\n 匹配一個(gè)換行符
\t 匹配一個(gè)制表符
\b 匹配一個(gè)單詞的結(jié)尾
^ 匹配一個(gè)字符串的開(kāi)始
$ 匹配一個(gè)字符串的結(jié)尾
\W 匹配非字母或數(shù)字或下劃線
\D 匹配非數(shù)字
\S 匹配非空白符
a|b 匹配字符a或字符b
a表達(dá)式|b表達(dá)式 匹配a或者b表達(dá)式中的內(nèi)容,如果匹配a成功了,不會(huì)繼續(xù)和b匹配, 所以,如果兩個(gè)規(guī)則有重疊部分,總是把長(zhǎng)的放在前面
() 分組,匹配括號(hào)內(nèi)的表達(dá)式,也表示一個(gè)組。約束某一個(gè)元字符的作用范圍,只在()內(nèi)生效
[] 字符組,匹配字符組中的字符
[^] 非字符組,匹配除了字符組中字符的所有字符
在正則表達(dá)式中能夠幫助我們表示匹配的內(nèi)容的符號(hào)都是正則中的 元字符
# [0-9] --> \d 表示匹配一位任意數(shù)字 digit
# [0-9a-zA-Z_] --> \w 表示匹配數(shù)字字母下劃線 word
# 空格 -->
# tab --> \t
# enter回車 --> \n
# 空格,tab和回車 --> \s 表示所有空白 包括空格 tab和回車
# [\d] \d 表示匹配數(shù)字
# [\d\D] [\w\W] [\s\S] 表示匹配所有
# [^\d] 匹配所有的非數(shù)字
# [^1] 匹配除數(shù)字1以外的所有
# [1-9]\d 匹配兩位整數(shù)
# [1357]\d 匹配1,3,5,7,開(kāi)頭的兩位整數(shù)
例1:匹配多個(gè)網(wǎng)址:
www\.oldboy\.com|www\.baidu\.com|www\.jd\.com|www\.taobao\.com #\.表示取消.的特殊意義
www\.(oldboy|baidu|jd|taobao)\.com #用() 來(lái)約束 | 描述的內(nèi)容的范圍
記憶元字符 : 都是表示能匹配哪些內(nèi)容,一個(gè)元字符總是表示一個(gè)字符位置上的內(nèi)容
# \d \w \s \t \n \D \W \S
# [] [^] .
# ^ $
# | ()
量詞:
量詞 用法說(shuō)明
* 重復(fù)0次或更多次,表示0次或多次 {0,}
+ 重復(fù)1次或更多次,表示1次或多次 {1,}
? 重復(fù)0次或1次,表示匹配0次或1次 {0,1}
{n} 重復(fù)n次,表示匹配n次
{n,} 重復(fù)n次或更多次,表示匹配至少n次
{n,m} 重復(fù)n到m次,表示至少匹配n次,至多m次
例:
匹配整數(shù) \d+
匹配小數(shù) \d+\.\d+
匹配整數(shù)或小數(shù) : \d+\.?\d* #存在問(wèn)題,比如1.也會(huì)被匹配到 ---> 分組的作用 : \d+(\.\d+)?
例:匹配手機(jī)號(hào)碼,手機(jī)號(hào)以1開(kāi)頭,第二位為3-9,總共11位
1[3-9]\d{9}
#判斷用戶輸入的內(nèi)容是否合法,如果用戶輸入的對(duì)就能查到結(jié)果,如果輸入的不對(duì)就不能查到結(jié)果
^1[3-9]\d{9}$
# 從一個(gè)大文件中找到所有符合規(guī)則的內(nèi)容
1[3-9]\d{9}
轉(zhuǎn)義符:
原本有特殊意義的字符,到了表達(dá)它本身的意義的時(shí)候,需要轉(zhuǎn)義。
. 有特殊的意義,取消特殊的意義\.
有一些有特殊意義的內(nèi)容,放在字符組中,會(huì)取消它的特殊意義
#只表示符號(hào)本身
[().*+?] 所有的內(nèi)容在字符組中會(huì)取消它的特殊意義
#表示:a-c (a減c)
[a\-c] -在字符組中表示范圍,如果不希望它表示范圍,需要轉(zhuǎn)義,或者放在字符組的最前面\最后面 。
取消一個(gè)元字符的特殊意義有兩種方法:
1. 在這個(gè)元字符前面加\
2. 對(duì)一部分字符生效,把這個(gè)元字符放在字符組里
# [.()+?*]
貪婪匹配:
1.貪婪匹配:在量詞范圍允許的情況下,盡量多的匹配內(nèi)容
.*x 表示匹配任意字符 任意多次數(shù) 遇到最后一個(gè)x才停下來(lái)
回溯算法:
2.非貪婪(惰性)匹配: 總是在量詞范圍內(nèi)盡量少的匹配內(nèi)容。前面的*,+等都是貪婪匹配,也就是盡可能匹配,后面加?號(hào)使其變成惰性匹配
.*?x 表示匹配任意字符 任意多次數(shù) 但是一旦遇到x就停下來(lái)
.+?x 匹配任意內(nèi)容至少1次 遇到x就停止
元字符+量詞+? ---> 惰性匹配
幾個(gè)常用的非貪婪匹配:
*? 重復(fù)任意次,但盡可能少重復(fù)
+? 重復(fù)1次或更多次,但盡可能少重復(fù)
?? 重復(fù)0次或1次,但盡可能少重復(fù)
{n,m}? 重復(fù)n到m次,但盡可能少重復(fù)
{n,}? 重復(fù)n次以上,但盡可能少重復(fù)
例:匹配身份證號(hào)碼:18/15位的身份證號(hào)
# 15位:首位數(shù)字為1-9,總共15位
[1-9]\d{14}
# 18位:首位數(shù)字為1-9,末位為0-9或者X,總共18位
[1-9]\d{16}[\dx]
[1-9]\d{16}[0-9x]
#1:
[1-9]\d{16}[0-9x]|[1-9]\d{14} #從一個(gè)大文件中找到所有符合規(guī)則的內(nèi)容。表示先匹配[1-9]\d{16}[0-9x]如果沒(méi)有匹配上就匹配[1-9]\d{14}
^([1-9]\d{16}[0-9x]|[1-9]\d{14})$ #檢測(cè)一個(gè)輸入的字符串是否合法
#2:簡(jiǎn)化
[1-9]\d{14}(\d{2}[\dx])? #從一個(gè)大文件中找到所有符合規(guī)則的內(nèi)容
^[1-9]\d{14}(\d{2}[\dx])?$ #檢測(cè)一個(gè)輸入的字符串是否合法 。()表示分組,將\d{2}[\dx]分成一組,就可以整體約束他們出現(xiàn)的次數(shù)為0-1次
例:
規(guī)則:1\d*?3 待匹配內(nèi)容:1243333344 匹配結(jié)果:1243
規(guī)則:1\d*3 待匹配內(nèi)容:1243333344 匹配結(jié)果:12433333
re模塊:
# findall 還是按照完整的正則進(jìn)行匹配,只是顯示括號(hào)里匹配到的內(nèi)容。 取所有符合條件的,優(yōu)先顯示分組中的。
ret = re.findall('9\d\d','19740ash93010uru')
print(ret)#['974', '930']
ret = re.findall('9(\d)\d','19740ash93010uru')
print(ret)#['7', '3']
# search 還是按照完整的正則進(jìn)行匹配,顯示也顯示匹配到的第一個(gè)內(nèi)容,但是我們可以通過(guò)給group方法傳參數(shù),來(lái)獲取具體分組,即()中的內(nèi)容。
search 只取第一個(gè)符合條件的,沒(méi)有優(yōu)先顯示這件事兒
得到的結(jié)果是一個(gè)變量
變量.group() 的結(jié)果 完全和 變量.group(0)的結(jié)果一致
變量.group(n) 的形式來(lái)指定獲取第n個(gè)分組中匹配到的內(nèi)容
ret = re.search('9(\d)(\d)','19740ash93010uru')
print(ret) # 變量 <_sre.SRE_Match object; span=(1, 4), match='974'>
if ret:
print(ret.group())#974 #ret.group(0) 0 默認(rèn)不寫(xiě)
print(ret.group(1))#7
print(ret.group(2))#4
# 為什么在search中不需要分組優(yōu)先 而在findall中需要?
加上括號(hào)是為了對(duì)真正需要的內(nèi)容進(jìn)行提取。 為什么要用分組? 把想要的內(nèi)容放分組里
如果我們要查找的內(nèi)容在一個(gè)復(fù)雜的環(huán)境中,我們要查的內(nèi)容并沒(méi)有一個(gè)突出的 與眾不同的特點(diǎn) 甚至?xí)筒恍枰碾s亂的數(shù)據(jù)混合在一起,這個(gè)時(shí)候我們就需要把所有的數(shù)據(jù)都統(tǒng)計(jì)出來(lái),然后對(duì)這個(gè)數(shù)據(jù)進(jìn)行篩選,把我們真正需要的數(shù)據(jù)對(duì)應(yīng)的正則表達(dá)式用()圈起來(lái),這樣我們就可以篩選出真正需要的數(shù)據(jù)了。
# 如何取消分組優(yōu)先
如果在寫(xiě)正則的時(shí)候由于不得已的原因,導(dǎo)致不要的內(nèi)容也得寫(xiě)在分組里,通過(guò) ?: 取消這個(gè)分組的優(yōu)先顯示
# (?:) 取消這個(gè)分組的優(yōu)先顯示
#findall
ret = re.findall('<\w+>(\w+)</\w+>','<h1>askh930s02391j192agsj</h1>')
print(ret)#['askh930s02391j192agsj']
# search
ret = re.search('<(\w+)>(\w+)</\w+>','<h1>askh930s02391j192agsj</h1>')
print(ret.group())#<h1>askh930s02391j192agsj</h1>
print(ret.group(1))#h1
print(ret.group(2))#askh930s02391j192agsj
#從exp中匹配出第一個(gè)加法,第一個(gè)減法, a+b 或者是a-b 并且計(jì)算他們的結(jié)果
exp = '2-3*(5+6)'
ret = re.search('(\d+)[+](\d+)',exp)
print(ret)
print(ret.group(1))#5
print(ret.group(2))#6
print(int(ret.group(1)) + int(ret.group(2)))#11
#將豆瓣源碼放到douban.html,從中獲取電影名:
with open('douban.html',encoding='utf-8') as f:
content = f.read()
ret = re.findall('<span class="title">(.*?)</span>(?:\s*<span class="title">.*?</span>)?',content)
print(ret)
#除了 霸王別姬,其他電影都是 肖申克的救贖 這種格式的。
(.*?) 要顯示的電影名 其中 ?是非貪婪匹配的標(biāo)志
(?:\s*<span class="title">.*?</span>)?
?: 取消這個(gè)分組的優(yōu)先顯示,整個(gè)()內(nèi)都不顯示 \s* 兩行代碼之間所有的空字符
.*? 電影英文名 ? 該部分出現(xiàn)0次 或者1次
# 什么是爬蟲(chóng)
# 通過(guò)代碼獲取到一個(gè)網(wǎng)頁(yè)的源碼,需要的是源碼中嵌著的網(wǎng)頁(yè)上的內(nèi)容 -- 正則表達(dá)式
#先安裝擴(kuò)展模塊 File--Settings--Project Interpreter-- + --找到包---Install Package
import requests
ret = requests.get('https://movie.douban.com/top250?start=0&filter=')
print(ret.content.decode('utf-8'))
總結(jié)
以上所述是小編給大家介紹的深入淺析正則表達(dá)式re模塊(部分),希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)我們網(wǎng)站的支持!
如果你覺(jué)得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!
上一篇:JavaScript 正則表達(dá)式備忘單實(shí)例代碼
欄 目:正則表達(dá)式
下一篇:shell高級(jí)學(xué)習(xí)之正則表達(dá)式
本文標(biāo)題:深入淺析正則表達(dá)式re模塊(部分)
本文地址:http://www.jygsgssxh.com/a1/zhengzebiaodashi/11167.html
您可能感興趣的文章
- 01-11正則表達(dá)式實(shí)現(xiàn)添加、刪除、替換三種功能
- 01-11python 用正則表達(dá)式篩選文本信息的實(shí)例
- 01-11正則表達(dá)式之匹配數(shù)字范圍
- 01-11python爬蟲(chóng)正則表達(dá)式之處理?yè)Q行符
- 01-11正則表達(dá)式匹配路由的實(shí)現(xiàn)代碼
- 01-11正則表達(dá)式截取身份證號(hào)碼加密的方法
- 01-11js正則表達(dá)式 匹配兩個(gè)特定字符間的內(nèi)容示例
- 01-11MySQL使用正則表達(dá)式進(jìn)行查詢操作經(jīng)典實(shí)例總結(jié)
- 01-11python正則表達(dá)式之對(duì)號(hào)入座篇
- 01-11詳解正則表達(dá)式實(shí)現(xiàn)二代身份證號(hào)碼驗(yàn)證


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 01-11正則表達(dá)式實(shí)現(xiàn)添加、刪除、替換三
- 01-11正則表達(dá)式之匹配數(shù)字范圍
- 01-11python 用正則表達(dá)式篩選文本信息的實(shí)
- 01-11正則表達(dá)式匹配路由的實(shí)現(xiàn)代碼
- 01-11python爬蟲(chóng)正則表達(dá)式之處理?yè)Q行符
- 01-11js正則表達(dá)式 匹配兩個(gè)特定字符間的
- 01-11正則表達(dá)式截取身份證號(hào)碼加密的方
- 01-11python正則表達(dá)式之對(duì)號(hào)入座篇
- 01-11MySQL使用正則表達(dá)式進(jìn)行查詢操作經(jīng)典
- 01-11詳解正則表達(dá)式實(shí)現(xiàn)二代身份證號(hào)碼
隨機(jī)閱讀
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 01-10delphi制作wav文件的方法
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 04-02jquery與jsp,用jquery
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置
- 01-10C#中split用法實(shí)例總結(jié)
- 01-11Mac OSX 打開(kāi)原生自帶讀寫(xiě)NTFS功能(圖文
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?


