加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

正则表达式的条件与分组的探索——基于python

发布时间:2020-12-14 06:45:41 所属栏目:百科 来源:网络整理
导读:本文是关于条件和分组的探索内容,将会在以后新的探索后进行更新,欢迎关注 一、基本符号 分组:() 分组命名:(?Pname rexp) 将 rexp 匹配的字符串作为分组 name 条件:(?(name)Y|N) 当存在分组 name 时,执行 Y 匹配,否则执行 N, "|N" 可以省略 二、关于

本文是关于条件和分组的探索内容,将会在以后新的探索后进行更新,欢迎关注


一、基本符号

分组:()

分组命名:(?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>bd+-.*) 来匹配 “数字 -” 这样的模式,并将组名命名为 ix1,得到的输出为

['1-','75-']

表示分别将 '1-' 和 '75-' 命名为 ix1 的组

这里看不出来分组命名的作用,我们往后面走


三、关于条件

现在,我们有了 ix1 分组,我们用他进行条件判断,正则表达式为

(?P<ix1>bd+-)(?(ix1)([^n]+))

后面这段 (?(ix1)([^n]+)) 表示当匹配 ix1 成功后,从 ix1 后面继续匹配得到的结果,于是得到以下结果

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


四、应用

那么现在需要想办法达到我们的目的了:“数字 -” 匹配带空格的字符串, “数字:”匹配不带空格的字符串

这里引入另外一个好用的扩展表达式,非捕获

(?:rexp)

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

于是,我们最终的解决思路出来了

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

返回结果如下

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


如果没有非捕获,返回的结果如下,会将该组内容返回

[('1-test fire','1-','2:joker_there',('75-just fine','75-','66:all_right','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>bd+-)
    (?(ix1)([^n]+))
)
|
(?:
    (?P<ix2>bd+:)
    (?(ix2)(w+))
)
'''

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

print res

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读