re模塊
模塊和實際工作時間的關系
time模塊和時間是什么關系?
re模塊和正則表達式的關系?
有了re模塊就可以在python語言中操作正則表達式
正則表達式
1:什么是正則表達式?
一套規則---匹配字符串的
2:正則表達式能做什么?
1.檢測一個輸入的字符串是否合法-------web開發項目 表單驗證
用戶輸入一個內容得時候,我們要提前做檢測,能夠提高程序的效率并且減輕服務器的壓力
2.從一個大文件中找到所有符合規則的內容 ---日志分析\爬蟲
能夠高效的從一大段文字中快速找到符合規則的內容
?
3:正則規則
所有的規則中的字符就剛好匹配到字符串中的內容
在正則表達式中能夠幫助我們表示匹配的內容得符號都是正則表達式中的元字符
元字符都是表示能匹配那些內容,一個元字符總是表示一個字符位置上的內容
1.字符組 [] 描述的是一個位置上能出現的所有可能性
[] 一個中括號只表示一個字符位置
如:匹配a或者b或者c
[0-9] 匹配數字
根據ASCII碼表進行范圍的比對
[a-zA-Z] 匹配大小寫
2.匹配符號
\d -------->[0-9] 表示匹配一位任意的數字
\w -------->[0-9a-zA-Z_] 匹配數字字母下劃線
\s --------->表示匹配空白符(空格\tab\enter)
空格 ----->
tab ----->\t
enter回車----->\n
\W ---------->表示匹配非數字字母下劃線
\D --------->表示匹配非數字
\S --------->表示匹配非空白符
[\d\D] ----->表示匹配所有
. -------->表示除換行之外的所有
[^\d] 表示匹配非數字
\b表示單詞的邊界
^ ---------->表示匹配一個字符串的開始
$ ---------->表示匹配一個字符串的結尾
或 a表達式|b表達式
匹配a表達式或者b表達式中的內容,如果匹配a成功了,不會繼續和b匹配,所以,如果兩個規則有重疊部分,總是把長的放在前面
分組 ()
約束|描述的內容的范圍問題
3.量詞
{n} 表示匹配n次
{n,} 表示匹配至少n次
{n,m} 表示至少匹配0次或1次
? 表示匹配0次或者1次
+ 表示一次或多次
* 表示0次或多次
4.貪婪匹配
在量詞范圍允許的條件下,盡量多的匹配內容
.*x 表示匹配任意字符 任意多次數 直至遇到最后一個x后才停下來
非貪婪匹配
元字符 量詞 ? 表示非貪婪
元字符 ? 元字符匹配0次或1次
.*?x 表示匹配任意字符 任意多次數 但是一旦遇到x就挺下來
5.轉義符
原本有特殊意義的字符,到了表達它本身的意義的時候需要轉義
有一些特殊意義的內容,放在字符組中,會取消他的特殊意義
[().*?] 所有的內容放在字符組中會取消他的特殊意義
[a\-c] -在字符組中表示范圍,如果不希望他表示范圍,需要轉義,或者放在字符組的最前面或者最后面
相關說明:
1.為啥要匹配0次
整數 \d+
小數 \d+\.\d+
小數或者整數
\d+(\.\d+)?
2. 匹配手機號碼
1[3-9]\d{9}
判斷用戶輸入的內容是否合法,如果用戶輸入的對就能查到結果,如果輸入的不對就不能查到結果
^1[3-9]\d{9}$
從一個大文件中找到所有符合規則的內容
1[3-9]\d{9}
匹配18/15位的身份證,規則如下:
15位:1-9 15
[1-9]\d{14}
18位:1-9 16 0-9/x
[1-9]\d{16}[\dx]
15或18位的身份證
[1-9]\d{16}[\dx]|[1-9]\d{14}
re模塊
import re
ret = re.findall("\d+","wrr432ee21r3tg")
print(ret) #找所有 返回一個列表
ret = re.search("\d+","fefrr32r445ergt56")
print(ret) #變量
pritn(ret.group()) #只能拿到一個,拿不到就報錯
if ret:
print(ret.group())
?
?
預習一個現象并且找到答案 ---分組有關系()
#findall 還是按照完整的正則進行匹配,只是顯示括號里面的匹配的內容
#取所有符合條件的,優先顯示分組中的
ret = re.findall("8(\d)\d","1845dwfer35435")
print(ret) #4
print(ret)
#search還是按照完整的正則表達式進行匹配,顯示也是顯示匹配 到的第一個內容,但是我們可以通過給group方法傳參數
#變量.group(n)的形式來指定獲取n個分組中匹配到內容
ret = re.search("8(\d)(\d)","ewrr2123512343456")
print(ret)
if ret:
print(ret.group())
print(ret.group(1))
print(ret.group(2))
為啥在search中不需要分組優先,而在findall中需要
加上括號是為了對真正需要的內容進行提取
?
為什么要用分組,以及findall的分組優先到底有什么好處
exp = "3-2*(5+3)"
# a+b或者是a-b并且計算他們的結果
ret = re.search("\d+[+]\d+",exp)
print(ret)
a,b = ret.split("+")
print(int(a)+int(b))
ret = re.search("(\d+)[+](\d+)",exp)
print(int.group(1)+int.group(2))
?
如果我們要查找的內容在一個復雜的環境中
我們要查的內容并沒有一個突出與眾不同的特點,甚至會和不需要的雜亂的數據混合在一起
這個時候我們就需要把所有的數據統計出來,然后對所有的數據進行篩選,把我們真正需要的數據對應的正則表達式用()圈起來
?
ret = re.findall("1(\d)(\d)","133456")
print(ret)
取消分組優先:
ret = re.findall("1(?:\d)(\d)","effed") #取消分組優先?:
?
?
?
什么是爬蟲
通過代碼獲取到一個網頁的源碼,要的是源碼中嵌入的網頁上的內容
import requests
ret = requests.get("https:// www.baidu.com").text()
?
分組和findall的現象
為什么要分組
把想要的內容放到分組里
如何取消分組優先
如果在寫正則的時候由于不得已的原因 導致不要內容也得寫在分組里
(?:)取消這個分組的優先顯示