python之re模塊

1、re模塊與正則表達式python

    今天咱們要整理python裏的re模塊和正則表達式,正則表達式不只在python領域,在整個編程屆都佔有舉足輕重的地位。git

  在沒有正式介紹re模塊以前咱們須要先了解一下什麼是正則表達式,它又與re模塊有什麼聯繫呢?正則表達式

    簡單介紹一下正則表達式並非Python的一部分。正則表達式是用於處理字符串的強大工具,擁有本身獨特的語法以及一個獨立的處理引擎,效率上可能不如str自帶的方法,但功能十分強大。得益於這一點,在提供了正則表達式的語言裏,正則表達式的語法都是同樣的,區別只在於不一樣的編程語言實現支持的語法數量不一樣;但不用擔憂,不被支持的語法一般是不經常使用的部分。若是已經在其餘語言裏使用過正則表達式,只須要簡單看一看就能夠上手了。編程

  正則表達式的用法   編程語言

   元字符
    \w 匹配數字字母下滑線 word關鍵字 [a-zA-Z0-9_]
    \d 匹配全部的數字 digit [0-9]
    \s 匹配全部的空白符 回車/換行符 製表符 空格 space [\n\t ]
        匹配換行符 回車 \n
        匹配製表符 tab \t
        匹配空格
      \W \D \S 和\w \d \s取反
      [\s\S] [\d\D] [\w\W]是三組全集 意思是匹配全部字符
      \b 表示單詞的邊界

        和轉義字母相關的 元字符
      \w \d \s(\n\t) \b \W \D \S

     ^ 與$
       ^ 匹配一個字符串的開始
       $ 匹配一個字符串的結束
  
    . 表示匹配 除換行符以外的全部字符

    [] 只要出如今中括號內的內容均可以被匹配
    [^] 只要不出如今中括號中的內容均可以被匹配
    有一些有特殊意義的元字符進入字符組中會回覆它原本的意義 : . | [ ] ( )


    a|b 或 符合a規則的或者b規則的均可以被匹配
     若是a規則是b規則的一部分,且a規則比b規則要苛刻/長,就把a規則寫在前面
    將更復雜的\更長的規則寫在最前面
    () 分組 表示給幾個字符加上量詞約束的需求的時候,就給這些量詞分在一個組


  量詞
    {n}表示 這個量詞以前的字符出現n次
    {n,} 表示這個量詞以前的字符至少出現n次
    {n,m} 表示這個量詞以前的字符出現n-m次
    ? 表示匹配量詞以前的字符出現 0次 或者 1次 表示無關緊要
    + 表示匹配量詞以前的字符出現 1次 或者 屢次
    * 表示匹配量詞以前的字符出現 0次 或者 屢次

2、re模塊的使用工具

  首先咱們在使用模塊的時候先要導入模塊,這時必不可少的步驟。spa

    1.findall   匹配列表中的每個元素code

1 import re 2 s="q6we798qw76sa45f"
3 ret=re.findall("\d",s) 4 print(ret) 5 #運行結果['6', '7', '9', '8', '7', '6', '4', '5']

 

    2.search  只會匹配到第一個符合的表達式(從左到右的順序),獲得的不是直接的結果,須要用group()方法來查看。這裏須要注意當沒有匹配到符合blog

   的表達式,直接打印會顯示None,而經過group()方法來查看會報錯內存

1 import re 2 s="as4d98qw7e"
3 ret=re.search("\d",s) 4 print(ret)  #運行結果:<_sre.SRE_Match object; span=(2, 3), match='4'>
5 print(ret.group())  #運行結果: 4

 

 

     findall 與 search 他們的用途都是用來查找,兩者的區別在於findall 能夠匹配所有結果,而search 只能匹配第一個結果。

    3.match 大致上與 search 用法相同,而不一樣點則是match默認在表達式前有 "^" 開頭符號

import re s = "123python456" re1 = re.search("\d+$",s) re2 = re.match("\d+$",s) print(re1.group())   #運行結果 : 456
print(re2.group())     #報錯 由於 match 在正則表達式前默認存在一個^,因此字符串s不是以數字開頭數字結尾。

    4.split  切割.   

1 import re 2 s = "123python456"
3 ret = re.split("\d$",s) 4 print(ret)    #運行結果:['123python45', '']

       5.sub 與 subn   替換   

import re s= "123python456" re1 = re.sub("\d","H",s) print(re1)    #運行結果 :HHHpythonHHH
re2 = re.subn("\d","H",s) print(re2)     #運行結果 :('HHHpythonHHH', 6) subn會返回一個元組,元組中的第二個元素是替換的次數

    6.compile 編譯  

      compile的做用是將正則表達式編譯爲字節碼,當屢次使用時不會屢次便宜,它的特色就是節省時間

1 import re 2 s = "laixue1python2HAPPY"
3 obj1= re.compile("\d") 4 re1 = obj1.findall(s) 5 print(re1)    #運行結果 : ['1', '2']
6 
7 obj2 = re.compile("[a-z]+") 8 print(obj2.search(s).group())   #運行結果: laixue

    7.finditer  返回一個存放匹配結果的迭代器,能夠經過group()方法來查看結果,它的特色就是減小空間內存

 1 import re  2 
 3 s = "13245python"
 4 ret = re.finditer("[a-z]",s)  5 print(ret)    # 運行結果 :<callable_iterator object at 0x000001BADC72EAC8> 已經能夠看出是迭代器了
 6 
 7 if ret.__iter__():  8     print(True)  9 else: 10     print(False) 11 # 判斷返回是否爲迭代器 運行結果爲True
12 
13 print([i.group() for i in ret ])   #運行結果 : ['p', 'y', 't', 'h', 'o', 'n'] 因此finditer 能夠用groud()方法來查看結果

  分組 ( )在re模塊中的使用

     分組 ( ) 在正則表達式中表示分組將多個表達式統一管理後接量詞來用,而在python的re模塊中 " ( ) "有着不同的用法

  1.分組 ( ) 表示優先級  

      在search中使用

1 import re 2 s = "132python456"
3 ret = re.search("\d+([a-z]+)\d+",s) 4 print(ret.group())    #運行結果 : 132python456
5 print(ret.group(1))     #運行結果 ; python
6 # 當咱們在表達式中添加分組表示優先級時,經過在group() 方法中添加參數能夠優先得到結果

 

      在findall中使用

1 import re 2 s = "123python456"
3 # ret = re.findall("\d+([a-z]+)\d+",s)
4 # print(ret) # 運行結果 : ['python']
5 # 當 ( ) 在findall中使用時,而沒法使用group()方法查看結果,這時默認匹配出( ) 內的結果
6 ret = re.findall("(\d+)([a-z]+)\d+",s) 7 print(ret)     # 運行結果 : [('123', 'python')] 
8 # 當 多個( )同時使用時,會將結果以元組的形式添加到列表中

      在split中使用

1 import re 2 s = "132python456"
3 ret = re.split("^\d+([a-z]+)",s) 4 print(ret)   #運行結果 : ['', 'python', '456']
5 # 在split中使用時() 內的表達式被切割後會留下來。

  2.取消 分組( ) 優先級  " ?:"

import re s = "123python456" ret = re.findall("(\d+)(?:[a-z]+)(\d+)",s) print(ret)      #運行結果 : [('123', '456')] # 當在( ) 內開頭加入" ?: "字符時 , 表示取消優先級 

  3.分組( ) 的命名   " ?P< >"     

1 import re 2 s = "123python123"
3 ret = re.search("(?P<a>\d+)([a-z]+)(?P=a)",s) 4 print(ret.group(0))  # 運行結果 : 123python123
相關文章
相關標籤/搜索