python爬蟲--正則解析方式

 

一.正則解析:

        提取數據步驟:創建正則對象-->匹配查找-->提取數據保存;

知識點:

1.單字符:
        . : 除換行以外所有字符
        [] :[aoe] [a-w] 匹配集合中任意一個字符
        \d :數字  [0-9]
        \D : 非數字
        \w :數字、字母、下劃線、中文
        \W : 非\w
        \s :所有的空白字符包,括空格、製表符、換頁符等等。等價於 [ \f\n\r\t\v]。
        \S : 非空白
2.數量修飾:
        * : 任意多次  >=0
        + : 至少1次   >=1
        ? : 可有可無  0次或者1次
        {m} :固定m次 hello{3,}
        {m,} :至少m次
        {m,n} :m-n次
3.邊界:
        $ : 以某某結尾 
        ^ : 以某某開頭
4.分組:
        (ab)  
    貪婪模式 .*
    非貪婪(惰性)模式 .*?

    re.I : 忽略大小寫
    re.M :多行匹配
    re.S :單行匹配

    re.sub(正則表達式, 替換內容, 字符串)

應用舉例一:

import re
line = "bobby123"
regex_str = "^b.*"   
# 必須以b開頭,任意字符匹配
(^控制開頭字符)
regex_str1 = "^b.3$"  
#(.*3$)必須以3結尾;
(^b.3$)不能運行成功,若改爲(^b.*3$)則可以;
($控制結位字符,.表示匹配任意字符,*表示匹配的次數)
if re.match(regex_str,line):
  print("yes")

應用舉例二:貪婪匹配模式和非貪婪匹配模式的區分

ps:  .*?爲非貪婪匹配模式 ;     貪婪匹配:反向匹配;

line2 = "boooooooobby123"

regex_str2 = ".*(b.+b).*"

regex_str2 = ".*(b.*b).*"

regex_str2 = ".*(b.{3,}b).*" #匹配兩次以上

regex_str2 = ".*(b.{2,5}b).*" #匹配兩次以上5次一下

regex_str2 = "( (boooooooobby|bobby)123)" #(|爲或;雙重()號則爲全匹配)

regex_str2 = "([abcd]ooby)123"#([]括號表示符合括號在內都行;符合abcd任意都行)

應用舉例三:中括號用途例子

[.*]  中括號內.*不代表模式匹配;

[^] 取反 不等於; 

電話號匹配 line = ‘18782902222’

regex_str2 = “1[48357][0-9]{9}”#區間0-9出現9次

regex_str2 = “1[48357][^1]{9}”#數字不等於1出現9次

#非貪婪匹配:  

regex_str2 = ".*?(b.*b).*?" 

match_obj = re.match(regex_str2,line2)

if match_obj:

   print(match_obj.group(1))

注意:match()函數 從字符串起始位置匹配;

          group()可以返回match對象中匹配的值;

         其他函數 :compile() search() findall() finditer() split() sub()

                  參考:https://www.runoob.com/python/python-reg-expressions.html

應用舉例四:提取中文

[\u4E00-\u9FA%]  :提取中文

Line = “study in 南京大學”
Ewgex_str = “.*?( [\u4E00-\u9FA%]+大學)“
#(.*匹配任意字符) 輸出:京大學
#(.*?匹配任意字符) 輸出:南京大學即爲非貪婪匹配
Match_obj = re.match(regex_str,line)
If match_obj:
  Print(match_obj.group(1))

應用舉例五:(\d  :代表數字 提取連續數字\d+)

Line = “xx出生於2001年”
Ewgex_str = “.*?(\d+)年”
Ewgex_str = “.*(\d{4}+)年”#限定四次;
#(.*匹配任意字符) 輸出:2001 
#(.*?匹配任意字符) 輸出:2001
Match_obj = re.match(regex_str,line)
If match_obj:
  Print(match_obj.group(1))

綜合案例:

import re
Line = “xxx出生於2001年6月1日”
Line = “xxx出生於2001/6/1日”
Line = “xxx出生於2001-6-1”
Line = “xxx出生於2001-06-01”
Line = “xxx出生於2001-06”
Regex_str = “.*出生於(\d{4}[年/-]\d{1,2}([月/-]\d{1,2}|[月/-]$|&))”
Match_obj = re.match(regex_str,Line)
If Match_obj:
Print(“yes”)

 

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