python關於re庫的整理


1,爬取解析一個簡單的網頁數據都有什么步驟呢?

  1.1,首先應該用requests構建一個請求,將請求成功返回的數據,傳遞給一個response對象,我們這里先假設這個response對象名字為 r 吧;

  1.2,然后嘛調用BeautifulSoup庫,比如BeautifulSoup(r.text,'html.parser')使用html解析器把html頁面的源代碼解析成易於理解標簽形式;

  1.3,正則表達式可以快速分析大量文本找到特定的字符串模式,然后進行提取編輯替換等操作;所以接下來就是對正則表達式的學習了;

 

2,正則表達式  regular expression;屬於python標准庫;

  2.0,正則表達式定義:正則表達式對應具有特定性質的一組字符串;

             正則表達式形式由普通字符和操作符組成,便於理解就稱為正則表達式;經過編譯后機器才會認可正則表達式代表一組字符串;

  2.1,正則表達式的常用操作符:

    2.1.1, .   表示除換行符外的任意單個字符;

    2.1.2, [ ] 表示單字符范圍;  eg:[abc]表示a或b或c;[a-z]表示a到z中的某一個字符;

    2.1.3, [^  ]  表示單字符排除范圍;  eg:[^abc]表示abc之外的任意字符;

         在[ ]里,一些特殊字符[ ]里開頭會有特殊意義,還有轉義字符會有特殊意義;剩下的特殊字符只是匹配范圍;(不確定,我這么理解)

    2.1.4,* 前一個字符任意次擴展,相當於{0,};  eg:abc*表示ab,abc,abcc等;

    2.1.5,+ 前一個字符至少一次擴展,相當於{1,};  eg: abc+表示abc,abcc,abccc等;

    2.1.6,?前一個字符擴展0次或1次,相當於{0,1};  eg: abc?表示ab或abc;

    2.1.7,{m} 前一個字符的m次擴展;  eg:abc{2}表示abcc;

    2.1.8,{m,n}前一個字符的[m,n]次擴展;  eg:ab[1,2]c 表示abc和abbc;

 

    2.1.9,| 表示左右表達式中的任意一個,用在()內,相當於或;  eg: (abc | abd) 表示abc或abd;

    2.1.10,^ 字符串開頭匹配;  eg: ^a匹配abc中的a,不匹配abc中的b和c;^b不匹配abc中的b;

    2.1.11,$字符串結尾匹配;  eg: c$ 匹配abc中的c,b$不匹配abc中的b;

    2.1.12,()分組標記,內部只能使用|操作符;  eg:(abc|abd)表示abc或abd;

 

    2.1.13,\d 表示數字0到9中的一個,相當於[0-9];

    2.1.14,\w 表示單字符a-z,A-Z,0-9;相當於[a-zA-Z0-9];

    2.1.15,\D表示數字0到9之外的單字符,相當於[^0-9];  (這里的運算符是[^  ]作為整體)

    2.1.16,\w表示除了a-z和A-Z和0-9之外的字符,相當於[^a-zA-Z0-9];

 

    2.1.17,尚待自行積累;還有好多的;:)

  2.2,正則表達式的經典實例;

    2.2.1, ^[a-zA-Z0-9]+$ :  表示僅由英文字符和數字組成的字符串; [1-9]?\d  : 表示0-99;

    2.2.2, [1-9]\d{5} : 表示我國境內的6位郵政編碼;

    2.2.3, ^-?\d+$ : 表示整數形式的字符串;-?這里代表的是負號是否需要;

    2.2.4,[\u4e00-\u9fa5]  :表示使用utf-8編碼來匹配中文字符;

  2.3,正則表達式的表示類型;

    2.3.1,raw string類型(原生字符串類型);

        類型格式: r ' 普通字符加操作符 '  ; eg:   r' [1-9]\d{5} ' ;

           類型備注:raw string類型中轉義字符就是轉義字符本身的語法和意義;

    2.3.2,string類型;

         類型格式:' 此處正則表達式若是有轉義字符,反斜杠重復一遍'  ;eg: ' [1-9]\\d{5}' ;

            類型備注:建議使用raw string;

 

3,正則表達式庫的部分函數方法;

  3.0,正則表達式的操作參數;

    3.0.1,pattern:正則表達式表示的字符串或原生字符串;簡單理解為正則表達式;

    3.0.2,string:等着被匹配出有效信息的字符串,簡稱帶匹配字符串;

    3.0.3,maxsplit : 待匹配字符串最大分割次數;

    3.0.4,repl : 替換匹配字符串的字符串;

    3.0.5,count:替換匹配字符串的最大替換次數;

    3.0.6,flags:正則表達式使用時的控制標記;

         (1)re.I :匹配時忽略英文字符大小寫的控制標記;全稱re.INGORECASE;

         (2)re.M :將^操作符的開頭匹配改為對字符串的每行開頭匹配的控制標記;全稱re.MULTILINE;

         (3)re.S :點操作符默認不匹配換行符,設置點操作符也可以匹配換行符的控制標記;全稱re.DOTALL;

  3.1,re.search(pattern,string,flags=0)

      函數功能:在字符串中找到匹配正則表達式的字符串,返回match對象;

      函數例子:re.search( r'[1-9]\d{10}' , '胡犀牛13019841984' ) 

      例子意義:表示將待匹配字符串中的電話號碼提取出來;(然后放到哪里呢??)      

  3.2,re.match(pattern,string,flags=0)

     函數功能:從字符串開頭進行re匹配,要是開頭不匹配re,則返回的match對象就是為空;

     函數例子:re.match( r'[1-9]\d{10}' , '胡犀牛13019841984')

     例子意義:待匹配字符串的開頭不是電話號碼,所以不匹配,返回match對象為空,如果調用當前這個空的match對象的方法就會報錯;因為空對象不存在屬性,也就不存在方法;

  3.3,re.findall(pattern,string,flags=0)

     函數功能:將待匹配字符串中所有能匹配的子串以列表形式返回;

     函數例子:re.findall( r'\d{11}' , '胡犀牛13019841984  鍾神醫 13018741874')

     例子意義:string中的兩個電話號碼都可以匹配,放入返回的列表類型中;

  3.4,re.split((pattern,string,maxsplit=0,flags=0)

     函數功能:將正則表達式作為分割點,按分割次數將字符串分割,其中可以匹配的子字符串每次分割的時候排除掉;返回列表類型;

     函數例子:re.split( r' \d{11}' , '胡犀牛13019841984  鍾神醫 13018741874',maxsplit=1)

     例子意義:分割后返回的列表類型為 [ '胡犀牛','薛神醫13018741874'];分割一次,所以排除了一個電話號碼,排除點作為分割點;

  3.5,re.finditer(pattern,string,flags=0)

     函數功能:將string中所有匹配子字符串作為一個迭代類型返回,其中每個迭代元素都是match對象,具有match對象的屬性;

     函數例子:for num in re.finditer( r'\d{11}','胡犀牛13019841984 薛神醫13018741874'):

     例子意義:匹配后的兩個號碼作為迭代類型,供num對象循壞調用;

  3.6,re.sub((pattern,repl, string,count=0,flags=0)

     函數功能:將匹配的子字符串替換掉,替換次數不超過count次,返回替換后的字符串;

     函數例子:re.sub(r'\d{11}','phone_num','胡犀牛13019841984 薛神醫13018741874')

     例子意義:替換后的字符串為 '胡犀牛phone_num 薛神醫phone_num' ;sub全稱substitute;

 

4,Re庫的調用形式;

  4.1,庫函數調用:輸入各種參數后,對庫函數進行調用,將結果返回存入一個對象中;這種函數調用每次都要重新編譯正則表達式,多了就慢了;

    eg: rst=re.search(r'\d{11}','胡犀牛13019841984 薛神醫1318741874')

  4.2,將正則表達式通過編譯函數后的結果存入對象中,這時這個對象等價於一組特定的字符串;然后去調用正則表達式的函數;減少編譯次數和部分參數的傳遞,加快程序運行速度;

    eg:  regex=re.compile( r'普通字符和操作符')     

      #編譯后的對象是re庫的對象,re庫的對象可以直接調用re庫對象的方法;

      #方法是一種類型的函數,專門供對象調用;函數就是我們平時說的可以實現某種功能的代碼塊;(我也不太理解其分類原理,先這么理解);

         regex.search( '待匹配的字符串' )  返回match對象;

      regex.match('待匹配的字符串')  返回match對象;

      regex.findall('待匹配字符串')  返回列表類型;

      regex.split('待匹配字符串')  返回列表類型;

      regex.finditer('待匹配字符串')  返回迭代類型,迭代元素為match對象;

      regex.sub('待匹配字符串')  返回字符串;

 

5,Re庫的match對象;

  意義:match對象是search方法,match方法和finditer方法的返回值(就是匹配的信息集合);

    (1)如果是search方法,可能string中會有多個子字符串匹配pattern正則表達式形式,但是返回的match對象中只保存第一次匹配的子字符串;

    (2)如果是match方法,match對象要么為空不存在,要么只保存第一個匹配的子字符串;

    (3)如果是finditer方法,match對象里面包含所有匹配的子字符串;要注意迭代;

  5.1,match對象的屬性;

    5.1.1,  .re  :返回對象的正則表達式;返回值中有re.complie()函數,因為python開發環境認為正則表達式不算正則表達式,要經過編譯之后才算;

    5.1.2,  .string  :返回對象的待匹配字符串;

    5.1.3,  .pos  :返回匹配過程從文本中搜索的開始位置;(我返回的兩次都是0)

    5.1.4,  .endpos  :返回匹配過程在搜索文本中的結束位置;(我返回的兩次都是string的長度)

  5.2, match對象的方法;

    5.2.1,  .group(n)  :返回被匹配的第n個子字符串;(n從0開始計數)

    5.2.2,  .start()  :返回子字符串在string中的開始位置;

    5.2.3,  .end()  :返回子字符串在string中的結束位置;

    5.2.4,  .span()  :返回子字符串在string中的開始位置和結束位置;

  5.3,5.2和4.2的方法有什么區別呢?

      4.2的方法是re庫對象的方法,調用了之后可能會返回match對象;而5.2的方法是match對象的方法;

  5.4,Re庫的貪婪匹配和最小匹配;

    5.4.1,貪婪匹配:正則表達式的開頭匹配后,中間和結尾同時有多種子字符串匹配的方式時,默認選擇最長的子字符串匹配;

       匹配例子:r=re.search(r'py*','pypyy') 匹配出來的結果是py,r=re.search(r'py*','pyy')有py和pyy兩種方式匹配,匹配出來的結果是兩種里面字符串最長的那種pyy;

    5.4.2,最小匹配:正則表達式的開頭匹配后,中間和結尾同時有多種方式匹配時,選擇最短的字符串匹配;

        最小匹配操作符:(1)  *? :表示前一個字符任意次擴展的最小匹配;

                 eg:re.search(r'py*?','pyy')表示y字符任意次擴展的最小匹配;那就0次擴展只剩p了;

                 (2)  +?  :表示前一個字符至少一次匹配的最小匹配,那就匹配一次;

                 (3)  ??  :表示前一個字符0次或1次擴展的最小匹配,那就匹配0次;

                 (4)  {m,n}?  :表示前一個字符m到n次擴展的最小匹配,那就配合字符串判斷匹配幾次,選個最短的;

 


免責聲明!

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



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