Python个人学习笔记 正则表达式(二)
非标记组
findall()用带有组的表达式匹配时,分组匹配的字符会被标记,这会改变findall()函数的行为,使得仅会返回组里面的内容,而不是整个表达式匹配的字符。
如果想获取整个表达式匹配到的字符串,可以用括号把整个表达式变成一个组。
但这样还会输出组里面的组的内容。
这时可以在组内开头加上 ?: 阻止组被标记,从而创建一个不被标记的组。

贪婪与回溯
正常情况下,正则表达式的匹配是贪婪的,且被一个表达式匹配过的字符不会再被后面的表达式匹配。贪婪表示尽可能匹配多的字符。
例如:
\( 匹配一个左括号,.*会先直接匹配后面的所有字符 ngm) hhay (nhf)。但这样 \) 就没有字符匹配了,应该会输出False。
这时候就会回溯一个字符让下一个表达式去匹配,如果失败会再回溯,尽可能地匹配成功。
回溯后 .* 匹配 ngm) hhay (nhf ,右括号留给 \),于是返回True。
贪婪与非贪婪(懒惰)
还是上面的例子,贪婪匹配 .* 会直接匹配整个字符串。
但如果只想要匹配括号的内容 (ngm)、(nhf),就需要在 *后面加上?实现非贪婪匹配。
这时候*匹配到下个表达式可匹配的字符后立即停止。
其他量词的非贪婪模式:
{m}是精准匹配,所以贪婪与非贪婪没有区别,但也不是没有非贪婪模式。

正向先行断言与正向后行断言
有些人打字喜欢在句尾加很多括号,这样匹配的话也会把这些括号也匹配进去。
可以用正向先行断言或正向后行断言来判断是不是所要的内容。
正向后行断言 (?<=表达式)
当前位置之前的内容符合后行断言里的表达式则匹配成功。
正向先行断言 (?=表达式)
当前位置之后的内容符合先行断言里的表达式则匹配成功。
负向先行断言与负向后行断言
负向先行断言 (?!表达式)
当前位置之后的内容不符合先行断言里的表达式则匹配成功。
负向后行断言 (?<!表达式)
当前位置之前的内容不符合先行断言里的表达式则匹配成功。

①断言里的表达式既不会被标记也不会被匹配,只是用来判断。
②后行断言中的表达式必须是固定长度的。
③多个断言可以在同一个位置同时使用。

命名组
?P<name>加在括号内、表达式前,可以给捕获组命名。
用 group() 索引Match对象的组时,也可以用组名来索引。
指定组也可以用组名来指定。
但是不能用组名来替换文本。

拆分字符串 re.split()
split()方法的正则表达式版。相当于 replace() 的正则表达式版是 re.sub() 。
比起 split() 方法,可以一次同时处理有多种分隔符的情况。
第三个参数为可拆分次数,参考 split() 方法。
第四个参数为功能标志。

