Python全栈工程师

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

2019-10-18  本文已影响0人  BeautifulSoulpy

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

总结:

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

上一篇下一篇

猜你喜欢

热点阅读