正则表达式的一些匹配规则

. 匹配任意的字符除\d意外
* 匹配前一个字符0次或无限次
+ 匹配前一个字符1次或无限次
? 匹配前一个字符0次或1
{m} 匹配前一个字符m次
{n,m} 匹配前一个字符m-n次,n省略为0-m,m省略为m-无限
| 匹配左右代表式任意匹配一个,如果左右成功则跳过右边
^ 匹配字符开头
$ 匹配字符结尾
\A 仅匹配字符串开头
\Z 仅匹配字符串结尾
\d 匹配数字
\D 匹配非数字
\s 匹配空白
\S 匹配非空白
\w 匹配单词字符
\W 匹配非单词字符

转义干扰

\代表转义,在正则表达式容易产生干扰,则使用r表示row data,也就是原始数据,让编译器忽略反斜杠,也就是不用转义的。

re.match函数

re.match 尝试从字符串的起始位置匹配

import re
line = "Cats are smarter than dogs"
matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I)
#re.M|re.I 为标志
#re.I 使匹配对大小写不敏感
#re.M 多行匹配,影响 ^ 和 $
if matchObj:
print "matchObj.group() : ", matchObj.group()
print "matchObj.group(1) : ", matchObj.group(1)
print "matchObj.group(2) : ", matchObj.group(2)
else:
print "No match!!"

运行结果

matchObj.group() : Cats are smarter than dogs
matchObj.group(1) : Cats
matchObj.group(2) : smarter

re.search函数

import re
line = "Cats are smarter than dogs";
searchObj = re.search( r'(.*) are (.*?) .*', line, re.M|re.I)
if searchObj:
print "searchObj.group() : ", searchObj.group()
print "searchObj.group(1) : ", searchObj.group(1)
print "searchObj.group(2) : ", searchObj.group(2)
else:
print "Nothing found!!"

运行结果

searchObj.group() : Cats are smarter than dogs
searchObj.group(1) : Cats
searchObj.group(2) : smarter

re.match与re.search的区别

re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。

import re
line = "Cats are smarter than dogs";
matchObj = re.match( r'dogs', line, re.M|re.I)
if matchObj:
print "match --> matchObj.group() : ", matchObj.group()
else:
print "No match!!"
matchObj = re.search( r'dogs', line, re.M|re.I)
if matchObj:
print "search --> matchObj.group() : ", matchObj.group()
else:
print "No match!!"

运行结果

No match!!
search --> matchObj.group() : dogs