爬蟲之正則表達式


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

注:此文來自網絡,回歸網絡


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM