python--“re”詳解


一、什么是正則表達式?

正則表達式(regular expression)描述了一種字符串匹配的模式,可以用來檢查一個串是否含有某種子串、將匹配的子串做替換或者從某個串中取出符合某個條件的子串等。

正則表達式的組件可以是單個的字符、字符集合、字符范圍、字符間的選擇或者所有這些組件的任意組合。 

 

二、正則表達式的基本語法。

1.備選字符集 

    語法:[可選字符列表]
        強調:1. 無論備選字符集包含多少字符,只能選1個
         2. 必須選1個!

      比如:6位數字的密碼: [0123456789][0123456789][0123456789][0123456789][0123456789][0123456789]
     簡化:1. 當備選字符連續時,可用-表示范圍的區間
        比如:[0123456789]-->[0-9]
        [0-9][0-9][0-9][0-9][0-9][0-9]
        [a-z]-->1位小寫字母
        [A-Z]-->1位大寫字母
        [A-Za-z]-->1位字母,大小寫都行
        [0-9a-zA-Z]-->1位字母或數字都行
     反選:[^不能選的字符列表]
     比如:[^47] 強調:^作“除了”使用時,只能放在開頭

   語法:X|Y
   表達式X|Y等價於[XY]
 
2、預定義字符集
為常用的字符集專門提供的簡化寫法!
      “\d”-->[0-9]-->1位數字                “\D”------一位非數字字符
      “\w”-->[0-9a-zA-Z_]-->1位字母,數字或_         “\W”------匹配任何非單詞字符,等價於[^0-9a-zA-Z_]
      “\s”-->1位空字符:匹配任何空白字符,包括空格、制表符、換頁符等等。等價於 [ \f\n\r\t\v]。      “\S”--------匹配非空白字符,等價於 [^\f\n\r\t\v]
   “\b”----匹配一個單詞邊界。比如,“er\b”可以匹配"never"中的"er",但不能匹配“verb”中的“er”。   “\B”--------匹配非單詞邊界。比如,"er\B"能匹配"verb"中的"er",但是不能匹配“never”中的“er

      “ . “: 除換行回車外的任何一個字符,如:
      
.
 3. 數量詞:規定相鄰的字符集可出現的次數
    確定數量:3種:
      {n}--> 必須反復出現n位
                {n,m}--> 最少出現n次,最多出現m次
              {n,}-->至少出現n次,多了不限!
    
          比如:/^\d{6}$/——6位數字
  

  不確定數量:3種
      *  大於等於0次
      +  至少出現一次
        ?  0次或1次
4. 指定匹配位置:
      ^表達式: 必須以表達式的規則為開頭
      表達式$: 必須以表達式的規則為結尾

     比如:選擇字符串開頭的空格?^\s*
           選擇結尾空格?\s*$
           選擇開頭或結尾的空格?^\s*|\s*$
     *預告:今后只要在程序中執行驗證:都要前加^后加$*
            表示從頭到尾完整匹配。

     比如:test():
       ^\d{6}$——從頭到尾必須只能是6位數字
    

5.預判

在進行正式匹配正則表達式之前,先預讀整個字符串,進行初步匹配,如果預判都不能通過,則不再驗證。

  (?:pattern)   非獲取匹配,匹配pattern但不獲取匹配結果,不進行存儲供以后使用。這在使用或字符“(|)”來組合一個模式的各個部分時很有用。例如“industr(?:y|ies)”就是一個比“industry|industries”更簡略的表達式。
  
  (?=pattern)   非獲取匹配,正向肯定預查,在任何匹配pattern的字符串開始處匹配查找字符串,該匹配不需要獲取供以后使用。例如,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”。預查不消耗字符,也就是說,在一個匹配發生后,在最后一次匹配之后立即開始下一次匹配的搜索,而不是從包含預查的字符之后開始。
  
  (?!pattern)   非獲取匹配,正向否定預查,在任何不匹配pattern的字符串開始處匹配查找字符串,該匹配不需要獲取供以后使用。例如“Windows(?!95|98|NT|2000)”能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中的“Windows”。
  
  (?<=pattern)     非獲取匹配,反向肯定預查,與正向肯定預查類似,只是方向相反。例如,“(?<=95|98|NT|2000)Windows”能匹配“2000Windows”中的“Windows”,但不能匹配“3.1Windows”中的“Windows”。 “(?<=95|98|NT|2000)Windows”目前在python3.6中re模塊測試會報錯,用“|”連接的字符串長度必須一樣,這里“95|98|NT”的長度都是2,“2000”的長度是4,會報錯。

       (?<!pattern)    非獲取匹配,反向否定預查,與正向否定預查類似,只是方向相反。例如“(?<!95|98|NT|2000)Windows”能匹配“3.1Windows”中的“Windows”,但不能匹配“2000Windows”中的“Windows”。這個地方不正確,有問題 .此處用或任意一項都不能超過2位,如“(?<!95|98|NT|20)Windows正確,“(?<!95|980|NT|20)Windows 報錯,若是單獨使用則無限制,如(?<!2000)Windows 正確匹配。 同上,這里在python3.6中re模塊中字符串長度要一致,並不是一定為2,比如“(?<!1995|1998|NTNT|2000)Windows”也是可以的。

  
 
 6.分組  
   ()括號里面的內容當作一個分組,當做一個整體 
   比如:(a|bc)de  表示ade 或者cdef
   
    給分組起別名:
    語法格式:  (?P<name> 分組內容)
    eg:(?P<mark>123abc)  這里的意思是給123abc這個分組起了個別名叫mark
    我們可以通過<?P=mark>的方式來訪問到該分組。
 7.貪婪模式和懶惰模式
貪婪模式:默認情況下,正則表達式會匹配最大的符合條件的字符串, *、+和?限定符都是貪婪的,因為它們會盡可能多的匹配文字,只有在它們的后面加上一個?就可以實現非貪婪或最小匹配。

比如 
  匹配字符串:123abc
  匹配規則:r"\d*[a-z]*?"       匹配結果為123
  匹配guize:r"\d*?[a-z]*"  匹配·結果為abc
 
8.python中re模塊的常用方法
  在python中,Pattern對象無法通過實例化來創建,只能通過re.compile()方法來返回一個pattern對象。
  pattern對象,即我們定義的匹配規則。
 
  1、re.match(pattern,str[,flags])這個函數是從str的開頭開始,嘗試匹配pattern,一直向后匹配,如果遇到無法匹配的字符或者到達str的末尾,立刻返回None,匹配成則返回一個match對象。
import re
s="HelloWorld" p=re.compile(r"Hello") m=p.match(s)
print(m.group())
print(m.span())

執行結果為:
Hello
(0,5)

"""對於p=re.compile(r"Hello")這一語句,re.compile(r"Hello")會返回一個Pattern對象,並把這個對象的引用賦值給p這個變量,此時,p就指向了pattern這個對象""" """對於m=p.match(s)這一語句,p.match(s),如果存在匹配結果,則返回一個match對象,如果不存在匹配結果,則返回None"""

下面,我們來詳細講一下Match對象中的方法
group()     //返回一個字符串或者元組
span()      //返回匹配規則在字符串中的位置
groups()      //用於分組的數據


現在,我們可以知道,在Pattern中也有一個match()方法,它和re中的match()方法,作用完全相同
 
              參數列表                              使用場景
re.match()     pattern(匹配規則),str(需要匹配的字符串),flags          使用不同的規則去匹配字符串
p.match()          str(需要匹配的字符串)                     使用同一規則去匹配一組字符串
      

 

2、re.search(pattern,str[,flags])

search()方法與match()方法極其類似,區別在於match()方法只從str的開始位置匹配,search()方法會掃描整個str查找匹配.

match()方法只有在str開始的位置匹配成功才會返回一個match對象,如果不是開始位置匹配的話,match()就返回一個None。

search()方法的返回對象和match()返回對象是一樣的。

import re
s="hahhaha lalala"
p=re.compile(r"la")
m=p.match(s)
print("match對象返回結果:"+m.group())

m1=p.search(s)
print("search方法返回結果:"+m1.group())

執行結果為:

 

 
          

 3.findall(pattern,str[,flags])//搜索整個str,以列表的形式返回匹配的全部子串

import re
s="hahhaha lalala"
p=re.compile(r"la")print("findall對象返回結果:"+str(re.findall(p,s)))##注意findall方法返回的是一個列表
m1=p.search(s)
print("search方法返回結果:"+m1.group())

執行結果:

 

 4、re.split(pattern,str[,maxsplit])//按照能夠匹配的子串將str分割后返回列表。maxsplit用於指定最大分割次數,不指定則默認將全部分割。

import re
p=re.compile(r"\d+")
l=re.split(p,"A1B2C3D4")
print(str(l))

執行結果為:

 

 
          

 5.re.sub(pattern,repl,str[,count])

使用repl替換str中每一個匹配的子串后返回一個被替換后的字符串。當repl是一個方法時。這個方法只接受一個參數(Match對象),並返回一個字符串。count用於指定最多替換的次數,不指定時,全部替換。

 


免責聲明!

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



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