文章目錄
正則表達式介紹
正則表達式就是描述字符串排列的一種規則,其主要用於字符串的匹配,經常用於找到某一類符合格式要求的數據;在python中我們經常用re模塊來實現正則表達式
正則表達式基礎
原子
原子是正則表達式最基本的組成單位,正則表達式至少包含一個一個原子,常見的原子有:
- 普通字符
- 非打印字符
- 通用字符
- 原子表
普通字符
普通字符如數字,字母,下劃線等都可以作爲原子,yes中含有三個原子:y、e、s
hello中含有he,所以匹配成功
非打印字符
非打印字符指的是字符串中用於格式控制的符號常見的有\n換行符,\t製表符
a中有換行,所以匹配成功
通用字符
通用字符:一個原子可以匹配一類字符,人們常用的
常見的通用字符及其意義
字符 | 意義 |
---|---|
\w | 匹配任意一個字母、數字或下劃線 |
\W | 匹配除字母、數字和下劃線以外的任意一個字符 |
\d | 匹配任意一個十進制數 |
\D | 匹配除十進制數以外的任意一個字符 |
\s | 匹配任意一個空白字符 |
\S | 匹配除空白字符以外的任意一個字符 |
匹配a中含有wpython的部分
原子表
原子表用[]表示,使用原子表可以定義一組地位平等的原子,匹配的時候取原子表中任意一個原子進行匹配,如[abc]str可以匹配字符串‘astr’,‘bstr’,‘cstr’;[^]代表除原子表裏的均可以匹配,如 [^abc]str可以匹配[d-z]str,不能匹配
‘astr’,‘bstr’,‘cstr’
元字符
元字符:正則表達式中具有特殊含義的字符;元字符分爲任意匹配字符,邊界限制元字符,界定符,模式選擇符,模式單元等
任意匹配字符
任意匹配字符‘.’,可用於匹配一個除換行符以外的任意字符
邊界限制元字符
- 用‘^‘匹配字符串的開始, ‘^abc‘表示可以匹配以abc開頭的字符串,其餘均不匹配
- 用’$‘匹配字符串的結束,‘$abc‘表示可以匹配以abc結尾的字符串,其餘均不匹配
限定符
常見限定符及其含義
限定符 | 含義 |
---|---|
* | 匹配0次、1次或多次前面的原子 |
? | 匹配0次、1次前面的原子 |
+ | 匹配1次或多次前面的原子 |
{n} | 前面的原子恰好出現n次 |
{n,} | 前面的原子至少出現n次 |
{n,m} | 前面的原子至少出現n次,至多出現m次 |
| | 模式選擇符 |
() | 模式單元符 |
-
*實例
匹配任意次,可以是0次
-
?實例
匹配0次或1次表示可以匹配不到
-
+實例
匹配一次或多次,不能是0次
-
{n}實例
{n}匹配前面原子恰好出現n次,其餘不匹配
-
{n,}實例
{n,}匹配前面原子出現次數大於等於n,小於n的無法匹配
-
{n,m}實例
匹配前面原子出現次數在[n,m]之間
模式選擇符
模式選擇符’|'可以設置多個匹配模式,匹配時滿足任意一個都可以
模式單元符
模式單元符‘()’,可以用()將原子組合成一個整體用於匹配,如(aa)表示把aa當做一個整體進行匹配,此時字符a是無法匹配的
模式修正
在不修改正則表達式前提下,模式修正可以修正正則表達式的含義,從而調整匹配結果。
常見模式修正符及其含義
修正符 | 含義 |
---|---|
I | 匹配時忽略大小寫 |
X | 匹配時忽略模式中的空白 |
S | 將字符串看作單行,換行符看做普通字符 |
- I 實例
加I之後忽略字母的大小寫
- X 實例
加x後忽略pattern中的空白
- S 實例
加S後可以匹配換行符\n
貪婪模式、懶惰模式
貪婪模式就是儘可能多的匹配,懶惰模式就是儘可能少的匹配。
常見的貪婪模式 .* 匹配任意多個任意字符,非貪婪就在貪婪模式中的*或+後面加?即可。
可以發現貪婪模式儘可能多的匹配結果,非貪婪模式則匹配到第一個結果後就直接返回結果
常用函數
re.match()
用於從源字符串的起始位置匹配一個模式,如果匹配成功則返回匹配的結果,否則返回None,匹配成功後可以使用.span()返回在源字符串中的位置
re.match(pattern,string,flag)
- pattern:匹配的表達式
- string:源字符串
- flag:標誌位,可以填寫模式修正符
該方法的侷限性是隻能從起始位置開始匹配
re.search()
用於匹配源字符串是否含有與模式相同的子串,如果匹配成功則返回匹配的結果,否則返回None,匹配成功後可以使用.span()返回在源字符串中的位置
re.search(pattern,string,flag)
- pattern:匹配的表達式
- string:源字符串
- flag:標誌位,可以填寫模式修正符
該方法可以匹配整個字符串,但只會返回第一次出現的位置
全局匹配函數
re.complie()對正則表達式進行預編譯,完成後使用findall()找出所有匹配結果
re.sub()
根據正則表達式來實現替換某些字符串
re.sub(pattern,rep,string,max)
- pattern:正則表達式
- rep:替換後留下的字符串
- string:用於被替換的字符串
- max:最多替換的次數,不填就會全部替換
Cookie介紹
通常來說,我們都是通過HTTP協議訪問網頁的,HTTP協議一種無狀態協議(不能維持會話間的狀態);
在HTTP協議中我們登錄一個網站後又退出了該網站,就需要重新登錄,爲了解決該問題引入了cookie和session。
- cookie將所有的會話信息保存在客戶端,當我們登錄後重新訪問同一個網頁時會從cookie中讀取會話信息來判斷會話狀態,如是否已經登錄
- seesion將所有會話信息存在服務器段,服務器端會給客戶端發sessionID等信息,這些信息一般存在cookie中,需要用都的時候從cookie中讀取
cookie處理——cookiejar
cookie處理思路:
- 導入cookie處理模塊http.cookiejar
- 使用http.cookiejar.CookieJar()創建CookieJar對象
- 使用HTTPCookieProcesscer創建cookie處理器,並將其作爲參構建opener對象
- 創建全局默認opener對象
創建好之後打開本地文件中的網頁就會登錄成功,不會像之前爬取下來的頁面沒有登錄(太複雜了就不累述了)