1. 程式人生 > >python關於re庫的整理

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.findditer(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,函式式用法;如果對於某個字串只用一次re操作,這樣用比較方便;

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

  4.2,將正則表示式形式的字串編譯生成regex物件,然後去呼叫正則表示式的函式;減少編譯次數,加快程式執行速度;

    eg:  regex=re.compile( 正則表示式的字串形式)     

      #將re字串形式編譯成pattern型別,物件名字也是pattern;是正則表示式物件,可以視作一組字串;

      #正則表示式物件可以呼叫RE庫的方法;那不就是re庫的函式嗎?而且因為re字串形式經過了編譯,好多引數不需要了還可以省略;

         regex.search( '待匹配的字串' )  返回match物件;

      regex.match('待匹配的字串')  返回match物件;

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

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

      regex.finditer('待匹配字串')  返回迭代型別,迭代元素為match物件;

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