正则表达式的条件与分组的探索——基于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,在线执行,并且有表达式的解释和常用符号表,还有自己的表达式库,非常方便











猜你喜欢

转载自blog.csdn.net/davied9/article/details/77543137