1.學習爬蟲,為什麼必須會正則表達式? 我們爬取一些網頁具體內容時,只需要這個網頁某個標簽的一部分內容就足夠,或者是這個標簽的某個屬性的值時,用普通的 xpath 或者css.selector是不能完成的,此時我們就需用到正則表達式去匹配獲取。2.正則表達式官方簡介? 正則表達式,又稱規則表達式。( ...
1.學習爬蟲,為什麼必須會正則表達式?
我們爬取一些網頁具體內容時,只需要這個網頁某個標簽的一部分內容就足夠,或者是這個標簽的某個屬性的值時,用普通的 xpath 或者css.selector是不能完成的,此時我們就需用到正則表達式去匹配獲取。
2.正則表達式官方簡介?
正則表達式,又稱規則表達式。(在代碼中常簡寫為regex、regexp或RE),電腦科學的一個概念。正則表達式通常被用來檢索、替換那些符合某個模式(規則)的文本。
1 ''' 2 正則表達式 3 ''' 4 5 import re 6 7 line = 'jijianXksA123' 8 9 # ^a 表示匹配以a開頭的字元串(只匹配一次) 10 # . 表示該字元可為任意字元(只匹配一次) 11 # * 表示前面的字元可以出現任意次(0次或多次)(多次匹配) 12 reg_str01 = '^j.*' # 表示以j開頭的字元串 13 # re.match 函數 14 # 第一個參數是匹配的格式 15 # 第二參數是要匹配的字元串 16 # 返回值為:匹配成功,返回match對象,否則返回:None 17 18 if re.match(reg_str01,line) : 19 print("匹配成功!") # reg_str = '^j.*' 匹配成功 20 else: 21 print("匹配失敗!") # reg_str = '^i.*' 匹配失敗 22 23 24 # 23$ 表示匹配以23結尾的字元串(只匹配一次) 25 reg_str02 = '^j.*23$' 26 if re.match(reg_str02,line) : 27 print("匹配成功!") # reg_str = '^j.*23$' 匹配成功 28 else: 29 print("匹配失敗!") # reg_str = '^j.*13$' 匹配失敗 30 31 32 line01 = 'boooboaobxby' 33 # () 內的為 匹配模式,通過 group函數 可以取出匹配結果 34 # 正則表達式貪婪匹配模式:從後面(右邊)開始匹配 35 reg_str03 = '.*(b.*b).*' 36 test01 = re.match(reg_str03,line01) 37 if test01: 38 print(test01.group(1)) # result : bxb 39 else: 40 print("匹配失敗!") 41 42 # 正則表達式非貪婪匹配模式:從前面(左邊)開始匹配 43 # ? : 表示從左邊開始匹配,匹配到第一個符合模式的內容,即進入模式 44 # 45 reg_str03 = '.*?(b.*b).*' # 半貪婪匹配 46 reg_str04 = '.*?(b.*?b).*' # 非貪婪匹配 47 test01 = re.match(reg_str03,line01) 48 test02 = re.match(reg_str04,line01) 49 if test01 and test02: 50 print(test01.group(1)) # result : boooboaobxb 51 print(test02.group(1)) # result : booob 52 else: 53 print("匹配失敗!")
1 import re 2 line01 = 'boooboaobcxby' 3 4 def regtest(reg_str,line = line01): 5 test = re.match(reg_str, line) 6 if test: 7 print(test.group(1)) 8 else: 9 print("匹配失敗!") 10 11 # + :表示前面的字元,至少出現一次 12 reg_str04 = '.*(b.+b).*' # (b.+b)表示b與b之間至少有一個字元 13 regtest(reg_str04) # result : bcxb 14 15 # {n} : 控制前面字元出現次數 16 # a{2} : 表示a出現兩次 17 # b{3,4} : 表示b至少出現3次,最多出4次 18 # c{4,} : 表示c至少出現4次 19 reg_str05 = '.*(b.{2}b).*' # (b.{2}b)表示匹配到的b與b之間,只有兩字元 20 reg_str06 = '.*(b.{3,4}b).*' # (b.{3,6}b)表示匹配到的b與b之間,至少有3個字元,至多有4個字元 21 reg_str07 = '.*(b.{4,}b).*' # (b.{8,}b)表示匹配到的b與b之間,至少有4個字元 22 regtest(reg_str05) # result : bcxb 23 regtest(reg_str06) # result : boaob 24 regtest(reg_str07) # result : boaobcxb 25 26 # | :表示 或 27 # (abc|123) : 表示匹配到 abc 或者 123,都算匹配成功 28 reg_str08 = '.*(boo|abc)' 29 reg_str09 = '.*(abc|boo)' 30 regtest(reg_str08) # result : boo 31 regtest(reg_str09) # result : boo 32 33 # [] : 表示 裡面包含的內容都可以進行匹配,包含內容只有錶面字元含義 34 # [abcd] : 表示 只要這個字元為 a/b/c/d中的一個都可以匹配成功 35 # [0-9] : 表示 只要這個字元在 0-9 這個區間內,都可以匹配成功 36 # [^x] : 表示匹配 字元不為 x 37 line02 = '電話號:15573563467' 38 reg_str10 = '.*(1[3458][0-9]{9}).*' 39 reg_str11 = '.*(1[3458][^1]{9}).*' 40 regtest(reg_str10,line02) # result : 15573563467 41 regtest(reg_str11,line02) # result : 15573563467 42 43 # \s 表示匹配空格,匹配一次 44 # \S 表示匹配不是空格的字元,匹配一次 45 # \w 表示匹配 A-Z、0-9、_ 中的容易字元,匹配一次 46 # \W 與 \w 相反 47 # \d 表示數字 48 # [\u4E00-\u9FA5] : 表示所有漢字,unicode 編碼 49 50 def regtest_test(reg_str,line = line01): 51 test = re.match(reg_str, line) 52 if test: 53 print(test.group(1)+':'+test.group(2)+'-'+test.group(3)+'-'+test.group(4)) 54 else: 55 print("匹配失敗!") 56 57 # 簡單實例 58 str01 = '張三出生於1997年12月20日' 59 str02 = '李四齣生於1989-01-20' 60 str03 = '王五齣生於1997/2/5' 61 str04 = '趙六齣生於1997.12.20' 62 str = [str01,str02,str03,str04] 63 # 提取出姓名+出生日期 64 # 匹配模式 65 reg_str12 = '(.*)出生於(\d{4})[.年/-](\d{1,2})[.月/-](\d{1,2}).*?' 66 for i in range(4): 67 regtest_test(reg_str12,str[i]) 68 # result : 69 # 張三:1997-12-20 70 # 李四:1989-01-20 71 # 王五:1997-2-5 72 # 趙六:1997-12-20
註:此文來自網路,回歸網路