Python中正規表示式的知識總結分享

黄舟
發布: 2017-09-23 11:34:26
原創
1400 人瀏覽過

本文介紹了Python正規表示式的相關基礎知識,本文的內容不包括如何撰寫高效的正規表示式、如何最佳化正規表示式,這些主題請查看其他教學課程。

1. 正規表示式語法

  1.1 字元與字元類別
     1 特殊字元:\.^$?+*{}[]()|
      以上特殊字元要想使用字面值,必須使用\進行轉義
     2 字元類別
      時如果沒有指定量詞則只會符合其中的一個。
       2. 字元類別內可以指定範圍,例如[a-zA-Z0-9]表示a到z,A到Z,0到9之間的任何一個字元
     3  3  3.一個^,表示否定一個字元類,例如[^0-9]表示可以匹配一個任意非數字的字元。
       4. 字元類別內部,除了\之外,其他特殊字元不再具備特殊意義,都表示字面值。 ^放在第一個位置表示否定,放在其他位置表示^本身,-放在中間表示範圍,放在字符類中的第一個字符,則表示-本身。

      5. 字符類內部可以使用速記法,例如\d \s \w
    3 速記法
       3 速記法
     , 3 速記法
    行符,則符合任意字元包括換行
       \d 符合一個Unicode數字,如果帶re.ASCII,則符合0-9
      \D 符合空白.ASCII,則匹配\t\n\r\f\v中的一個
       \S 匹配Unicode非空白
        \S 匹配Unicode非空白

       \w 匹配單詞字符,如果帶有匹配單詞字符,如果帶有單詞字符,如果單詞匹配單詞-Z0-9_]中的一個

       \W 匹配Unicode非單子字元

  1.2 量詞
     1. 匹配前面的字元字元0次或多次
     3. + 匹配前面的字元1次或多次
     4. {m} 匹配前面表達式m次
    4. {m} 匹配前面表達式m次
    式 比 5. {mm5.次
     6. {,n} 匹配前面的正則表達式最多n次
     7. {m,n} 匹配前面的正則表達式至少n次,最多表達式

  #       以上量詞都是貪婪模式,會盡可能多的匹配,如果要改為非貪婪模式,透過在量詞後面跟隨一個?來實現


  1.3 組與捕獲
    1  :
       1. 捕獲()中正則表達式的內容以備進一步利用處理,可以透過在左括號後面跟隨?:來關閉這個括號的捕獲功能
      內容 2.組合,以便使用量詞或|
    2 反響引用前面()內捕獲的內容:
       1. 透過組號反向引用
      1. 透過組號反向引用
      1. 透過組號反向引用
         從1開始,由左到右遞增,可以透過\i引用前面()內表達式捕獲的內容
       2. 透過組名反向引用前面小號內捕獲的內容

    可以透過在前面小 後面跟隨?P,尖括號中放入組名來為一個組起一個別名,後面透過(?P=name)來引用前面捕獲的內容。如(? P\w+)\s+(?P=word)來匹配重複的單字。 ###     3 注意點:###       反向引用不能放在字元類別[]中使用。 ###

   1.4 斷言與標記
     斷言不會匹配任何文本,只是對斷言所在的文本施加某些約束
     1 常用單字斷言:
       1 常用字詞:
     []中則表示backspace
      2. \B 匹配非單字邊界,受ASCII標記影響
       3. \A 在起始處匹配
     3. \A 在起始處匹配
     3。 ,則在每個換行符後匹配
       5. \Z 在結尾處匹配
       6. $ 在結束時匹配
       6。 ?=e) 正前瞻
       8. (?!e) 負前瞻
       9. (?<=e) 正評論
  9. (?<=e) 正評論
     2前瞻回顧的解釋
       前瞻:exp1(?=exp2) exp1後面的內容要符合exp2
     負前瞻 1(!expexp    ; =exp2)exp1 exp1前面的內容要符合exp2
      負後顧: (?  負後顧: (?  負後顧: (?  一     前則必須查找表達式可以這樣寫:"(hello)\s+(?=world)",用來匹配"hello wangxing"和"hello world"只能匹配到後者的hello

  1.5 條件匹配
     (?(id)yes_exp|no_exp):對應id的子表達式如果匹配到內容,則這裡匹配yes_exp,否則匹配no_exp

  1.6 正則表達式的標誌
   式正則表達式的標誌##   式正則表達式。的標誌有兩種使用方法
       1. 透過給予compile方法傳入標誌參數,多個標誌使用|分割的方法,如re.compile(r"#[\da-f]{6}\b" , re.IGNORECASE|re.MULTILINE)
      2. 透過在正規表示式前面加上(?標誌)的方法為正規表示式加上標誌,如(?ms)#[\da-z]{6}\ b
    2. 常用的標誌
       re.A或re.ASCII, 使\b \B \s \S \w \Wd \D都假定為假設為ASC .I或re.IGNORECASE 使正規表示式忽略大小寫
       re.M或re.MULTILINE 多行匹配,使每個^在每個回車後,每個$在每個回車前匹配
       re.S或re.DOTALL 使.能匹配任意字符,包括回車
       re.X或者re.VERBOSE 這樣可以在正則表達式跨越多行,也可以添加註釋\ [ ]來表示,因為預設的空白不再解釋。如:
         re.compile(r"""
          < >]*? #不是src的屬性
           src= #src屬性的開始
           (?:
          (?P[^\1>]+?) #圖片名字
           ( ?P=quote) #右括號
           """,re.VERBOSE|re.IGNORECASE)

2. Python正則表達式模塊

   2.1 正規表示式處理字串主要有四大功能

     1. 匹配查看一個字串是否符合正規表示式的語法,一般傳回式來擷取字串中符合要求的文字
     3. 取代尋找字串中符合正規表示式的文本,並以對應的字串取代
     4. 分割使用正規表示式。

##   2.2 Python中re模組使用正規表示式的兩種方法


     1. 使用re.compile(r, f)方法產生正規表示式對象,然後呼叫正規表示式物件對應的方法。不同的是傳入的第一個參數是正規表示式字串。

     1. rx.findall(s,start, end):
      傳回一個列表,如果正規表示式中沒有分組,則列表包含的是所有符合的內容,## 〠 〠                   無無正則則則有則為正則中則未則為正則中則是 我們則中則所包含在正則表達式有分組,則清單中的每個元素是一個元組,元組中包含子分組中匹配到的內容,但是沒有傳回整個正則表達式匹配的內容
     2. rx.finditer(s, start, end):
      返回一個可迭代對象
       對可迭代對象進行迭代,每一次返回一個匹配對象,可以調用匹配對象的group()方法查看指定組匹配到的內容,0表示整個正則表達式符合到的內容
     3. rx.search(s, start, end):
      返回一個匹配對象,倘若沒匹配到,就返回N   返回一個匹配對象,倘若沒匹配到,就返回N繼續往後匹配
     4. rx.match(s, start, end):
      如果正則表達式在字符串的起始處匹配,就返回一個匹配對象,否則返回Nf#       rx.sub(x, s, m):
      回傳一個字串。每一個符合的地方用x替換,傳回替換後的字串,如果指定m,則最多替換m次。對於x可以使用/i或/gid可以是群組名稱或編號來引用捕獲到的內容。
       模組方法re.sub(r, x, s, m)中的x可以使用一個函數。此時我們就可以對捕獲到的內容推過這個函數進行處理後再替換匹配到的文字。
     6. rx.subn(x, s, m):
      與re.sub()方法相同,差別在於返回的是二元組,其中一項是結果字串,一項是做替換的個數。
     7. rx.split(s, m):分割字串
       傳回一個列表
    存在分組,則將分組配對到的內容放在清單中每兩個分割的中間作為清單的一部分,如:
       rx = re.compile(r"(\d)[a-z]+(\d)")
      s = "ab12dk3klj8jk9jks5"
      result = rx.split(s)
    result = rx.split(s)
  ,      3' 5' ]
    8. rx.flags():正規表示式編譯時設定的標誌
     9. rx.pattern():正規表示式編譯時所使用的字串#  2.符合物件的屬性與方法


    01. m.group(g, ...)
      傳回編號或群組名稱相符到的內容,預設或0表示整個表達式符合到的內容,如果指定多個,就回傳一個元組

     02. m.groupdict(default)

      回傳一個字典。字典的鍵是所有命名的組的組名,值為命名組捕獲到的內容
       如果有default參數,則將其作為那些沒有參與匹配的組的預設值。

     03. m.groups(default)

      回傳一個元群組。包含所有捕獲到內容的子分組,從1開始,如果指定了default值,則這個值作為那些沒有捕獲到內容的組的值
     04. m.lastgroup()
         最高的捕獲組的名稱,如果沒有或沒有使用名稱則傳回None(不常用)
    05. m.lastindex()
      匹配到內容的編號最高的捕獲組的編號,如果沒有就返回N 。
     06. m.start(g):
      當前匹配對象的子分組是從字符串的那個位置開始匹配的,如果當前組沒有參與匹配就返回-1
[F  7. (g)
      當前匹配物件的子分組是從字串的那個位置匹配結束的,如果當前組沒有參與匹配就返回-1
    08. m.span()##     08. m.span()##     08. m.span()##     08.組,內容分別是m.start(g)和m.end(g)的回傳值
     09. m.re()
         式
      . string()
      傳遞給match或search用於匹配的字串
     11. m.pos()
      搜尋的起始位置。即字串的開頭,或start指定的位置(不常用)
    12. m.endpos()
      搜尋的結束位置。即字串的結尾位置,或end指定的位置(不常用)


  2.5 總結

#

     1. 對於正規表示式的匹配功能,Python沒有傳回true和false的方法,但可以透過對match或search方法的回傳值是否為None來判斷
     2. 對於正規表示式的搜尋功能,如果只搜尋一次可以使用search或match方法傳回的符合物件得到,對於搜尋多次可以使用finditer方法傳回的可迭代物件來迭代存取
     3. 對於正規表示式的取代功能,可以使用正規表示式物件的sub或subn方法來實現,也可以透過re模組方法sub或subn來實現,差異在於模組的sub方法的替換文字可以使用一個函數來產生
     4. 對於正規表示式的分割功能,可以使用正規表示式物件的split方法,需要注意如果正規表示式物件有分組的話,分組捕獲的內容也會放到傳回的清單中

以上是Python中正規表示式的知識總結分享的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!