美文网首页Python全栈工程师
24.2-正则的分组断言贪婪非贪婪

24.2-正则的分组断言贪婪非贪婪

作者: BeautifulSoulpy | 来源:发表于2019-10-18 17:26 被阅读0次

    让人迷茫的原因只有一个,那就是本该拼搏的年纪,想得太多,却做得太少!

    总结:

    1.分组与匹配、分组与断言的关系,内容是否一样;
    2.匹配与分组的内容可能不一样;
    3.贪婪和非贪婪的区别在于 重复和非重复

    正则的分组断言

    分组

    1. 正则用上(),就会引入分组; 首位:引入分组+优先级 ;
    2. 对于分组而言,整个表达式永远算作第0组
    3. 后向引用,引用的仅仅是文本内容,而不是正则表达式!
      也就是说,组中的内容一旦匹配成功,后向引用,引用的就是匹配成功后的内容,引用的是结果,而不是表达式。
    后向引用
    (\d{1,3})(.\1){3}这个表达式实际上匹配的是四个数都相同的IP地址,比如:123.123.123.123。
    
    

    1. 分组与匹配的关系:

    没有匹配一定没有分组;有分组就说明有匹配
    但分组不一定和匹配一样;

    2. 断言与分组的关系
    分组和断言没有关系;
    断言不会被捕获,断言不占分组号。断言如同条件,只是要求匹配必须满足断言的条件。

    断言

    断言,就是指明某个字符串前边或者后边,将会出现满足某种规律的字符串。

    代码 说明 举例
    x|y 匹配x或者y wood took foot food,使用 w|food 或者 (w|f)ood
    捕获
    (pattern) 使用小括号指定一个子表达式,也叫分组;捕获后会自动分配组号从1开始;可以改变优先级
    \数字 匹配对应的分组 (very) \1 匹配very very,但捕获的组group是very \1引用分组1
    (?:pattern) 仅仅为了改变优先级,不捕获分组 (?:w|f)ood'industr(?:y|ies)等价'industry|industries'
    (?<name>exp) (?'name'exp) 分组捕获,但是可以通过name访问分组;Python语法必须是(?P<name>exp)
    零宽断言 wood took foot food
    (?=exp) 零宽度正预测先行断言;断言exp一定在匹配的右边出现,也就是说断言后面一定跟个exp f(?=oo)f后面一定有oo出现
    (?<=exp) 零宽度正回顾后发断言;断言exp一定在匹配的左边出现,也就是说断言后面一定有个exp (?<f)food、(?<=t)ook分别匹配ood、ook、ook前一定有t出现
    负向零宽断言
    (?!exp) 零宽度负预测先行断言;断言exp一定不会出现在右侧,也就是说断言后面一定不是exp \d{3}{?!\d}匹配3位数字,断言3位数字后面一定不能是数字
    (?<!exp) 零宽度负回顾后发断言;断言exp一定不会出现在左侧,也就是说断言后面一定不能是exp (?<!f)ood ood的左边一定不是f
    注释
    (?#comment) 注释(不建议在表达式中使用) f(?=00)(?#这个后断言不捕获)
    正向断言:
    f(?=ood)   先行断言,f后面一定跟ood;
    (?<=f)ood    后发断言, ood左边 < 一定是f;
    
    负向断言
    匹配字符  123456
    \d{3}(?!\d)   \d{3}后面一定不能是数字
    
    (?<!f)ood ood的左边一定不是f
    
    

    注意:

    1. 断言会不会捕获呢?也就是断言占不占分组号呢?
      断言不会被捕获,断言不占分组号。断言如同条件,只是要求匹配必须满足断言的条件。
      分组和断言没有关系;

    分组和捕获在有的地方 是同一个意思
    使用正则表达式时,能用简单表达式,就不要复杂的表达式

    贪婪与非贪婪(尽可能多与少)

    默认是贪婪模式,也就是说尽量多匹配更长的字符串。
    非贪婪模式很简单,在重复的符号后面加上一个?问号,就尽量的少匹配了。
    贪婪和非贪婪的区别在于 重复和非重复

    匹配与分组的内容可能不一样;

    food foot wood
    f(.*?)d  #非贪婪
    
    Match Position       Length           Group1
    #-----------------------------------------------------
    food      0            4                 oo
    food wood 5            9              oot woo
    
    f(.*)d  #贪婪
    Match Position       Length           Group1
    #-----------------------------------------------------
    food foot wood  0      14          ood foot woo
    
    
    代码 说明 举例
    *? 匹配任意次,但尽可能少重复
    +? 匹配至少1次,,但尽可能少重复
    ?? 匹配0次或1次,,但尽可能少重复
    {n,}? 匹配至少n次,但尽可能少重复
    {n,m}? 匹配至少n次,至多m次,但尽可能少重复
    贪婪与非贪婪
    字符:very very happy
    v.*?y     #非贪婪
    #------------------------
    very
    very
    
    v.*y     #贪婪
    #------------------------
    very very happy
    
    

    相关文章

      网友评论

        本文标题:24.2-正则的分组断言贪婪非贪婪

        本文链接:https://www.haomeiwen.com/subject/nmiimctx.html