您好,登錄后才能下訂單哦!
這篇文章主要介紹了正則表達式re模塊的示例分析,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
正則表達式:
官方定義:正則表達式是對字符串操作的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個“規則字符串”,這個“規則字符串”用來表達對字符串的一種過濾邏輯。
什么是正則表達式: 一套規則 - 匹配字符串的
談到正則,就只和字符串相關了。我們要考慮的是在同一個位置上可以出現的字符的范圍。
正則表達式能做什么:
?1.檢測一個輸入的字符串是否合法 -- web開發項目 表單驗證 ?用戶輸入一個內容的時候,我們要提前做檢測
?能夠提高程序的效率并且減輕服務器的壓力
?2.從一個大文件中找到所有符合規則的內容 -- 日志分析\爬蟲 ?能夠高效的從一大段文字中快速找到符合規則的內容
字符組 : [字符組]
在同一個位置可能出現的各種字符組成了一個字符組,在正則表達式中用[]表示。一個中括號只表示一個字符位置
字符分為很多類,比如數字、字母、標點等等。假如你現在要求一個位置"只能出現一個數字",那么這個位置上的字符只能是0、1、2...9這10個數之一。
字符組 描述的是一個位置上能出現的所有可能性
# 接受范圍,可以描述多個范圍,連著寫就可以了
# [abc] 一個中括號只表示一個字符位置,匹配a或者b或者c
# [0-9] 匹配數字0-9,根據ASCII進行范圍的比對
# [a-z] 匹配所有的小寫字母
# [A-Z] 匹配所有的大寫字母
# [a-zA-Z] 匹配所有的大小寫字母
# [0-9a-z]
# [0-9a-zA-Z_]
元字符:
字符:
元字符 匹配內容的規則
. 匹配除換行符以外的任意字符
\w 匹配字母或數字或下劃線
\s 匹配任意的空白符
\d 匹配數字
\n 匹配一個換行符
\t 匹配一個制表符
\b 匹配一個單詞的結尾
^ 匹配一個字符串的開始
$ 匹配一個字符串的結尾
\W 匹配非字母或數字或下劃線
\D 匹配非數字
\S 匹配非空白符
a|b 匹配字符a或字符b
a表達式|b表達式 匹配a或者b表達式中的內容,如果匹配a成功了,不會繼續和b匹配, 所以,如果兩個規則有重疊部分,總是把長的放在前面
() 分組,匹配括號內的表達式,也表示一個組。約束某一個元字符的作用范圍,只在()內生效
[] 字符組,匹配字符組中的字符
[^] 非字符組,匹配除了字符組中字符的所有字符
在正則表達式中能夠幫助我們表示匹配的內容的符號都是正則中的 元字符
# [0-9] --> \d 表示匹配一位任意數字 digit
# [0-9a-zA-Z_] --> \w 表示匹配數字字母下劃線 word
# 空格 -->
# tab --> \t
# enter回車 --> \n
# 空格,tab和回車 --> \s 表示所有空白 包括空格 tab和回車
# [\d] \d 表示匹配數字
# [\d\D] [\w\W] [\s\S] 表示匹配所有
# [^\d] 匹配所有的非數字
# [^1] 匹配除數字1以外的所有
# [1-9]\d 匹配兩位整數
# [1357]\d 匹配1,3,5,7,開頭的兩位整數
例1:匹配多個網址:
www\.oldboy\.com|www\.baidu\.com|www\.jd\.com|www\.taobao\.com #\.表示取消.的特殊意義
www\.(oldboy|baidu|jd|taobao)\.com #用() 來約束 | 描述的內容的范圍
記憶元字符 : 都是表示能匹配哪些內容,一個元字符總是表示一個字符位置上的內容
# \d \w \s \t \n \D \W \S
# [] [^] .
# ^ $
# | ()
量詞:
量詞 用法說明
* 重復0次或更多次,表示0次或多次 {0,}
+ 重復1次或更多次,表示1次或多次 {1,}
? 重復0次或1次,表示匹配0次或1次 {0,1}
{n} 重復n次,表示匹配n次
{n,} 重復n次或更多次,表示匹配至少n次
{n,m} 重復n到m次,表示至少匹配n次,至多m次
例:
匹配整數 \d+
匹配小數 \d+\.\d+
匹配整數或小數 : \d+\.?\d* #存在問題,比如1.也會被匹配到 ---> 分組的作用 : \d+(\.\d+)?
例:匹配手機號碼,手機號以1開頭,第二位為3-9,總共11位
1[3-9]\d{9}
#判斷用戶輸入的內容是否合法,如果用戶輸入的對就能查到結果,如果輸入的不對就不能查到結果
^1[3-9]\d{9}$
# 從一個大文件中找到所有符合規則的內容
1[3-9]\d{9}
轉義符:
原本有特殊意義的字符,到了表達它本身的意義的時候,需要轉義。
. 有特殊的意義,取消特殊的意義\.
有一些有特殊意義的內容,放在字符組中,會取消它的特殊意義
#只表示符號本身
[().*+?] 所有的內容在字符組中會取消它的特殊意義
#表示:a-c (a減c)
[a\-c] -在字符組中表示范圍,如果不希望它表示范圍,需要轉義,或者放在字符組的最前面\最后面 。
取消一個元字符的特殊意義有兩種方法:
1. 在這個元字符前面加\
2. 對一部分字符生效,把這個元字符放在字符組里
# [.()+?*]
貪婪匹配:
1.貪婪匹配:在量詞范圍允許的情況下,盡量多的匹配內容 .*x 表示匹配任意字符 任意多次數 遇到最后一個x才停下來 回溯算法: 2.非貪婪(惰性)匹配: 總是在量詞范圍內盡量少的匹配內容。前面的*,+等都是貪婪匹配,也就是盡可能匹配,后面加?號使其變成惰性匹配 .*?x 表示匹配任意字符 任意多次數 但是一旦遇到x就停下來 .+?x 匹配任意內容至少1次 遇到x就停止 元字符+量詞+? ---> 惰性匹配 幾個常用的非貪婪匹配: *? 重復任意次,但盡可能少重復 +? 重復1次或更多次,但盡可能少重復 ?? 重復0次或1次,但盡可能少重復 {n,m}? 重復n到m次,但盡可能少重復 {n,}? 重復n次以上,但盡可能少重復 例:匹配身份證號碼:18/15位的身份證號 # 15位:首位數字為1-9,總共15位 [1-9]\d{14} # 18位:首位數字為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} #從一個大文件中找到所有符合規則的內容。表示先匹配[1-9]\d{16}[0-9x]如果沒有匹配上就匹配[1-9]\d{14} ^([1-9]\d{16}[0-9x]|[1-9]\d{14})$ #檢測一個輸入的字符串是否合法 #2:簡化 [1-9]\d{14}(\d{2}[\dx])? #從一個大文件中找到所有符合規則的內容 ^[1-9]\d{14}(\d{2}[\dx])?$ #檢測一個輸入的字符串是否合法 。()表示分組,將\d{2}[\dx]分成一組,就可以整體約束他們出現的次數為0-1次 例: 規則:1\d*?3 待匹配內容:1243333344 匹配結果:1243 規則:1\d*3 待匹配內容:1243333344 匹配結果:12433333 re模塊: # findall 還是按照完整的正則進行匹配,只是顯示括號里匹配到的內容。 取所有符合條件的,優先顯示分組中的。 ret = re.findall('9\d\d','19740ash93010uru') print(ret)#['974', '930'] ret = re.findall('9(\d)\d','19740ash93010uru') print(ret)#['7', '3'] # search 還是按照完整的正則進行匹配,顯示也顯示匹配到的第一個內容,但是我們可以通過給group方法傳參數,來獲取具體分組,即()中的內容。 search 只取第一個符合條件的,沒有優先顯示這件事兒 得到的結果是一個變量 變量.group() 的結果 完全和 變量.group(0)的結果一致 變量.group(n) 的形式來指定獲取第n個分組中匹配到的內容 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 默認不寫 print(ret.group(1))#7 print(ret.group(2))#4 # 為什么在search中不需要分組優先 而在findall中需要? 加上括號是為了對真正需要的內容進行提取。 為什么要用分組? 把想要的內容放分組里 如果我們要查找的內容在一個復雜的環境中,我們要查的內容并沒有一個突出的 與眾不同的特點 甚至會和不需要的雜亂的數據混合在一起,這個時候我們就需要把所有的數據都統計出來,然后對這個數據進行篩選,把我們真正需要的數據對應的正則表達式用()圈起來,這樣我們就可以篩選出真正需要的數據了。 # 如何取消分組優先 如果在寫正則的時候由于不得已的原因,導致不要的內容也得寫在分組里,通過 ?: 取消這個分組的優先顯示 # (?:) 取消這個分組的優先顯示 #findall ret = re.findall('<\w+>(\w+)</\w+>','<h2>askh930s02391j192agsj</h2>') print(ret)#['askh930s02391j192agsj'] # search ret = re.search('<(\w+)>(\w+)</\w+>','<h2>askh930s02391j192agsj</h2>') print(ret.group())#<h2>askh930s02391j192agsj</h2> print(ret.group(1))#h2 print(ret.group(2))#askh930s02391j192agsj #從exp中匹配出第一個加法,第一個減法, a+b 或者是a-b 并且計算他們的結果 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) #除了 霸王別姬,其他電影都是 肖申克的救贖 這種格式的。 (.*?) 要顯示的電影名 其中 ?是非貪婪匹配的標志 (?:\s*<span class="title">.*?</span>)? ?: 取消這個分組的優先顯示,整個()內都不顯示 \s* 兩行代碼之間所有的空字符 .*? 電影英文名 ? 該部分出現0次 或者1次 # 什么是爬蟲 # 通過代碼獲取到一個網頁的源碼,需要的是源碼中嵌著的網頁上的內容 -- 正則表達式 #先安裝擴展模塊 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'))
感謝你能夠認真閱讀完這篇文章,希望小編分享的“正則表達式re模塊的示例分析”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。