python正则表达式

常用正则表达式操作符

操作符说明实例
.表示任何单个字符
[]字符集,对单个字符给出取值范围[abc]表示a、b、c,[a-z]表示a到z的单个字符
[^]非字符集,对单个字符给出排除范围[^abc]表示非a或b或c的单个字符
*前一个字符的0次或无穷次扩展abc*表示ab、abc、abcc、abccc等
+前一个字符的1次或无限次扩展abc+表示abc、abcc、abccc等
?前一个字符的0次或1次扩展abc?表示ab、abc
|左右表达式各一个abc|def表示abc、def
{m}扩展前一个字符m次ab{2}c表示abbc
{m,n}扩展前一个字符m至n次(含n)ab{1,2}c表示abc、abbc
^匹配字符串开头^abc表示abc且在一个字符串的开头
$匹配字符串结尾abc$表示abc且在一个字符串的结尾
()分组标记,内部只能使用|操作符(abc)表示abc,(abcldef)表示abc、def
\d数字,等价于[0-9]
\w单词字符,等价于[A-Za-z0-9_]

经典正则表达式实例

匹配首尾空白字符的正则表达式:^s*|s*$ 匹配Email地址的正则表达式:w+([-+.]w+)@w+([-.]w+).w+([-.]w+)* 匹配网址URL的正则表达式:[a-zA-z]+://[^s]*

匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}, 从五位数开始匹配,也就是 10000 匹配中国邮政编码:[1-9]d{5}(?!d), 中国邮政编码为6位数字 匹配身份证:d{15}|d{18},评注:中国的身份证为15位或18位 匹配ip地址:d+.d+.d+.d+, 评注:提取ip地址时有用

贪婪模式与非贪婪模式

贪婪模式(Greedy)

在正则中,表示次数的量词默认是贪婪的,在贪婪模式下,会尝试尽可能最大长度去匹配

字符串 aaabb 中使用正则 a* 的匹配过程

img

img

分析

a* 在匹配开头的 a 时,会尽量匹配更多的 a,直到第一个 b 不满足要求为止,匹配上三个 a,后面每次匹配时都得到空字符串

非贪婪匹配(Lazy)

如何从贪婪模式变成非贪婪模式呢

量词后面加上 ? ,正则就变成了 a*?

img