欢迎光临散文网 会员登陆 & 注册

Python个人学习笔记 正则表达式(二)

2023-04-19 21:18 作者:ベレッタ  | 我要投稿

非标记组

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() 方法。

第四个参数为功能标志。



Python个人学习笔记 正则表达式(二)的评论 (共 条)

分享到微博请遵守国家法律