python爬蟲教程小白從零開始項目實戰(4)

什麼是正則表達式?

//1.點號 .

一個點號可以替換除了換行符以外的任何一個字符

開頭是“kin”,後面兩個字符都是“me”
例如
kingname 
kinabcme
kin123me
kin我是誰me
kin嗨你好me
kin“m”me
就可以變成kin...me的形式,中間有多少個字符就有多少個點

2.星號 *

一個星號表示前面一個子表達式(普通字符,另外一個或幾個正則表達式)0次到無限次

例如
如果快樂你就笑哈
如果快樂你就笑哈哈
如果快樂你就笑哈哈哈
如果快樂你就笑哈哈哈哈哈哈哈

用星號來表示:
如果快樂你就笑哈*
   		由於星號可以表示前面字符的0次,即使寫出如果快樂你就笑*,也能滿足正則表達式

--------------------------------------------------------------
如果點號星號一起用會怎麼樣?
.*.*哈:
它可以表示在“如”和“哈”中間出現“任意多個除了換行符以外的任意字符”
舉例:
如哈        //不寫
如果我快樂哈  //漢字
如1123//數字
如asddc哈     //字母
如 ? + =//符號

3.問號 ?

問號:表示它前面的子表達式0次或1次。//這裏的問號是英文的問號

笑起來。
笑起來哈。
		在漢字 “來”和中文句號之間有0個或者1個哈字,都可以用下面這個正則表達式
笑起來哈?。

問號最大的用處是與點號和星號配合起來使用 構成 .*?.通過正則表達式,使用最多的也是這個組合。

如哈
如果快樂哈
如果快樂你就笑哈
如果你知道1+1=2請證明它
如asdfgh哈
都可以用如.*?哈正則表達式
那麼 .*.*?有什麼區別?
//將通過實際的例子進行解答

4.反斜槓 \

反斜槓轉義字符

有下面這樣的字符串
我的密碼是*123456*不包括最外層星號
通過正則表達式表示
我的密碼是\*.*\*不包括最外層星號

5.數字

正則表達式裏面使用 \d 來表示一位數字。爲什麼要用字母d呢?
因爲是英文 digital //數字的首字母
如果提取兩個數字,可以使用\d \d
如果提取兩位數字,可以使用\d\d\d
不知道數字有多少位,就使用*表示任意位數的數字

有下面一段字符串
是123455677,請記住它。
用正則表達式來表示
是\d*,請記住它。

6.小括號 ()

有下面一段字符串
我的密碼是:12345abcde你幫我記住。
用正則表達式表示
:.*?)你
就可以獲得
12345abcde

7.導入正則表達式,使用findall方法

python已經自帶了一個功能非常強大的正則表達式模塊。
使用這個模塊可以非常方便的從一大段文字中提取有規律的信息
python的正則表達式模塊名字爲 re,也就是regular expression的首字母縮寫。
使用正則表達式之前,要進行導包語句

導包語句爲:
import re

包內有些方法需要我們學習

findall的函數原型爲:
re.findall(pattern,string,flags=0)
pattern //正則表達式
string //字符串
flags//特殊功能標誌
findall的結果是一個列表,包含匹配到的所有結果,如果沒有匹配到,就會返回空列表。

import re

content ='我的微博密碼是:123456,QQ密碼是:33445566,銀行卡密碼是:888888,請幫我記住他們'
password_list=re.findall(':(.*?),',content)
lost_list=re.findall('那沒事了(.*?)',content) #//故意寫錯正則表達式,找不到
print('找到內容,返回:{}'.format(password_list))
print('找不到內容,返回:{}'.format(lost_list))

運行結果
在這裏插入圖片描述

import re

account_content ='公衆號是:乖氣致異,密碼是:gongzhonghao123456,cnds賬號是:999999,密碼是:123456,'
account_password=re.findall('號是:(.*?),密碼是:(.*?),',account_content)
print('包含多個括號的情況,返回:{}'.format(account_password))

在這裏插入圖片描述

請注意查看代碼中的冒號:逗號, 實際使用正則表達式的過程中,中英文標點符號經常導致各種問題. 中英文符號是根本不一樣的,看起來非常相似,在某些字體甚至無法察覺,因此使用正則表達式時,最好直接複製粘貼,不要手動輸入

中文符號 ,:
英文符號 , :

re.findall(pattern,string,flags=0)
這個flags 參數是可以省略的
使用flags可以忽略大小寫,忽略換行符等等…
這裏以忽略換行符說明,示範

import re
string='''
我是xiaowei,我的微博密碼是:123
45678,'''
password_flags=re.findall('密碼是:(.*?),',string,re.S)
password_noflags=re.findall('密碼是:(.*?),',string)
print('使用re.S的時候:{}'.format(password_flags))
print('不使用re.S的時候:{}'.format(password_noflags))

運行結果
在這裏插入圖片描述

使用爬蟲開發非常容易出現這樣的情況,要匹配的內容存在換行符\n. 要忽略換換行符,就需要使用到re.S這個flags. 雖然說匹配到的結果出現了\n 這個符號,不過總比什麼都拿不到要強.內容裏面的換行符在後期清洗數據替換掉即可.

9.本章內容到此結束了

我們瞭解了什麼是正則表達式
並且敲代碼實踐了,並學會了導包和findall方法的使用.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章