让人迷茫的原因只有一个,那就是本该拼搏的年纪,想得太多,却做得太少!
总结:
1.分组与匹配、分组与断言的关系,内容是否一样;
2.匹配与分组的内容可能不一样;
3.贪婪和非贪婪的区别在于 重复和非重复;
正则的分组断言
分组
- 正则用上(),就会引入分组; 首位:引入分组+优先级 ;
- 对于分组而言,整个表达式永远算作第0组
- 后向引用,引用的仅仅是文本内容,而不是正则表达式!
也就是说,组中的内容一旦匹配成功,后向引用,引用的就是匹配成功后的内容,引用的是结果,而不是表达式。
后向引用
(\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
注意:
- 断言会不会捕获呢?也就是断言占不占分组号呢?
断言不会被捕获,断言不占分组号。断言如同条件,只是要求匹配必须满足断言的条件。
分组和断言没有关系;
分组和捕获在有的地方 是同一个意思
使用正则表达式时,能用简单表达式,就不要复杂的表达式
贪婪与非贪婪(尽可能多与少)
默认是贪婪模式,也就是说尽量多匹配更长的字符串。
非贪婪模式很简单,在重复的符号后面加上一个?问号,就尽量的少匹配了。
贪婪和非贪婪的区别在于 重复和非重复;
匹配与分组的内容可能不一样;
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
网友评论