正則表達式的條件與分組的探索——基於python

本文是關於條件和分組的探索內容,將會在以後新的探索後進行更新,歡迎關注


一、基本符號

分組:()

分組命名:(?P<name> rexp)          將 rexp 匹配的字符串作爲分組 name

條件:(?(name)Y|N)                       當存在分組 name 時,執行 Y 匹配,否則執行 N, "|N" 可以省略




二、關於分組命名

     先看輸入

caseStr = r'''
    1-test fire
    2:joker_there
    75-just fine
    66:all_right
'''

      有兩種格式:“數字 -” , “數字:”; “數字 -” 匹配帶空格的字符串, “數字:”匹配不帶空格的字符串


      我們以     (?P<ix1>\b\d+\-.*)    來匹配 “數字 -” 這樣的模式,並將組名命名爲 ix1,得到的輸出爲

      ['1-', '75-']

      表示分別將 '1-' 和 '75-' 命名爲 ix1 的組

      這裏看不出來分組命名的作用,我們往後面走


三、關於條件

      現在,我們有了 ix1 分組,我們用他進行條件判斷,正則表達式爲

      (?P<ix1>\b\d+\-)(?(ix1)([^\n]+))

      後面這段  (?(ix1)([^\n]+)) 表示當匹配 ix1 成功後,從 ix1 後面繼續匹配得到的結果,於是得到以下結果

      [('1-', 'test fire'), ('75-', 'just fine')]

     

四、應用

      那麼現在需要想辦法達到我們的目的了:“數字 -” 匹配帶空格的字符串, “數字:”匹配不帶空格的字符串

      這裏引入另外一個好用的擴展表達式,非捕獲

      (?:rexp)

      表示匹配 rexp 表達式的字符串,但是不返回匹配內容

     於是,我們最終的解決思路出來了

      mStr = r'''
      (?:
          (?P<ix1>\b\d+\-)
          (?(ix1)([^\n]+))
      )
      |
      (?:
          (?P<ix2>\b\d+\:)
          (?(ix2)(\w+))
      )
      '''

     返回結果如下

      [('1-', 'test fire', '', ''), ('', '', '2:', 'joker_there'), ('75-', 'just fine', '', ''), ('', '', '66:', 'all_right')]

    

     如果沒有非捕獲,返回的結果如下,會將該組內容返回

     [('1-test fire', '1-', 'test fire', '', '', ''), ('', '', '', '2:joker_there', '2:', 'joker_there'), ('75-just fine', '75-', 'just fine', '', '', ''), ('', '', '', '66:all_right', '66:', 'all_right')]

     由於非捕獲不能和分組命名/條件嵌套,所以,這已經是博主能想到的最好的方式了

     如果有讀者能夠消除多餘字符串的返回(直接通過正則表達式達成),歡迎在評論區留言



五、附源碼

#-*-coding:utf8;-*-
import re

caseStr = r'''
1-test fire
2:joker_there
75-just fine
66:all_right
'''

print caseStr

mStr = r'''
(?:
    (?P<ix1>\b\d+\-)
    (?(ix1)([^\n]+))
)
|
(?:
    (?P<ix2>\b\d+\:)
    (?(ix2)(\w+))
)
'''

res = re.findall(mStr, caseStr, re.VERBOSE)

print res

# 2018/06/26 # 

發現一個開源的正則表達式工具,叫做Regex101,在線執行,並且有表達式的解釋和常用符號表,還有自己的表達式庫,非常方便











發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章