美文网首页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-正则的分组断言贪婪非贪婪

    让人迷茫的原因只有一个,那就是本该拼搏的年纪,想得太多,却做得太少! 总结: 1.分组与匹配、分组与断言的关系,内...

  • Python基础022--正则表达式

    正则表达式模块、贪婪匹配和非贪婪匹配、正则分组、match和search的使用 常用的正则表达式元字符 正则表达式...

  • 正则表达式 学习

    参考:正则表达式30分钟入门教程 元字符 字符转义 分枝条件 分组 向后引用 零宽断言 负向零宽断言 贪婪和懒惰 ...

  • 正则表达式的贪婪模式和非贪婪模式

    一、什么是贪婪模式和非贪婪模式? 定义 贪婪模式:正则表达式趋向于匹配最大长度。 非贪婪模式:正则表达式趋向于匹配...

  • 006.聊聊 JavaScript 正则表达式 下卷

    有点复杂,是转载的文章 贪婪模式与非贪婪模式讲解 Javascript中的正则贪婪与非贪婪模式的区别是: 被量词修...

  • Day18学习总结-正则表达式和Pygame

    贪婪与非贪婪 非贪婪:在正则中控制匹配不确定次数的符号后边可以加?,来表示尽可能少的匹配贪婪:在贪婪的时候,匹配是...

  • 正则表达式

    1.什么是贪婪模式和非贪婪模式? 贪婪模式 一般情况下,正则表达式在匹配过程中会尽可能多的匹配 非贪婪模式 让正则...

  • JavaScript 正则表达式( 匹配网页的图片地址)

    正则表达式 - 元字符 贪婪模式与非贪婪模式 贪婪与非贪婪模式影响的是被量词修饰的子表达式的匹配行为;贪婪模式 在...

  • 039 Python语法之正则表达式

    正则的基本语法 贪婪与非贪婪模式 Python中的数量词默认是贪婪模式的,总是默认尝试匹配更多的字符,非贪婪模式则...

  • 正则表达式基础语法

    常用匹配 匹配 限定符 分支条件,分组 零宽断言 懒惰与贪婪

网友评论

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

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