[toc]

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}$
匹配国内电话号码:d{3}-d{8}|d{4}-d{7}, 匹配形式如 0511-4405222 或 021-87888822 920-209 642-964
匹配腾讯qq号:^[1-9][0-9]{4,10}$, 从五位数开始匹配,也就是 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