正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。
Python自1.5版本起增加了re模块,它提供Perl风格的正则表达式模式。
re模块使Python语言拥有全部的正则表达式功能。
compile函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换。
re模块也提供了与这些方法功能完全一致的函数,这些函数使用一个模式字符串做为它们的第一个参数。
本章节主要介绍Python中常用的正则表达式处理函数。
re.match尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。
函数语法:
re.match(pattern,string,flags=0)函数参数说明:
匹配成功re.match方法返回一个匹配的对象,否则返回None。
我们可以使用group(num)或groups()匹配对象函数来获取匹配表达式。
以上实例运行输出结果为:
(0,3)None实例#!/usr/bin/pythonimportreline="Catsaresmarterthandogs"matchObj=re.match(r'(.*)are(.*).*',line,re.M|re.I)ifmatchObj:print"matchObj.group():",matchObj.group()print"matchObj.group(1):",matchObj.group(1)print"matchObj.group(2):",matchObj.group(2)else:print"Nomatch!!"以上实例执行结果如下:
matchObj.group():CatsaresmarterthandogsmatchObj.group(1):CatsmatchObj.group(2):smarterre.search方法re.search扫描整个字符串并返回第一个成功的匹配。
re.search(pattern,string,flags=0)函数参数说明:
匹配成功re.search方法返回一个匹配的对象,否则返回None。
(0,3)(11,14)实例#!/usr/bin/pythonimportreline="Catsaresmarterthandogs";searchObj=re.search(r'(.*)are(.*).*',line,re.M|re.I)ifsearchObj:print"searchObj.group():",searchObj.group()print"searchObj.group(1):",searchObj.group(1)print"searchObj.group(2):",searchObj.group(2)else:print"Nothingfound!!"以上实例执行结果如下:searchObj.group():CatsaresmarterthandogssearchObj.group(1):CatssearchObj.group(2):smarterre.match与re.search的区别re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。
Nomatch!!search-->searchObj.group():dogs检索和替换Python的re模块提供了re.sub用于替换字符串中的匹配项。
语法:
re.sub(pattern,repl,string,count=0,flags=0)参数:
执行输出结果为:
A46G8HFD1134re.compile函数compile函数用于编译正则表达式,生成一个正则表达式(Pattern)对象,供match()和search()这两个函数使用。
语法格式为:
re.compile(pattern[,flags])参数:
pattern:一个字符串形式的正则表达式
flags:可选,表示匹配模式,比如忽略大小写,多行模式等,具体参数为:
在上面,当匹配成功时返回一个Match对象,其中:
再看看一个例子:
在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果有多个匹配模式,则返回元组列表,如果没有找到匹配的,则返回空列表。
注意:match和search是匹配一次findall匹配所有。
findall(string[,pos[,endpos]])参数:
查找字符串中的所有数字:
输出结果:
['123','456']['88','12']多个匹配模式,返回元组列表:
[('width','20'),('height','10')]re.finditer和findall类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。
re.finditer(pattern,string,flags=0)参数:
1232433re.splitsplit方法按照能够匹配的子串将字符串分割后返回列表,它的使用形式如下:
re.split(pattern,string[,maxsplit=0,flags=0])参数:
re.compile()返回RegexObject对象。
group()返回被RE匹配的字符串。
正则表达式可以包含一些可选标志修饰符来控制匹配的模式。修饰符被指定为一个可选的标志。多个标志可以通过按位OR(|)它们来指定。如re.I|re.M被设置成I和M标志:
模式字符串使用特殊的语法来表示一个正则表达式:
字母和数字表示他们自身。一个正则表达式模式中的字母和数字匹配同样的字符串。
多数字母和数字前加一个反斜杠时会拥有不同的含义。
标点符号只有被转义时才匹配自身,否则它们表示特殊的含义。
反斜杠本身需要使用反斜杠转义。
由于正则表达式通常都包含反斜杠,所以你最好使用原始字符串来表示它们。模式元素(如r'\t',等价于'\\t')匹配相应的特殊字符。
下表列出了正则表达式模式语法中的特殊元素。如果你使用模式的同时提供了可选的标志参数,某些模式元素的含义会改变。
jim
264***7522@qq.com
#!/usr/bin/pythonimportreline="Catsaresmarterthandogs"matchObj=re.match(r'(.*)are(.*).*',line,re.M|re.I)ifmatchObj:print"matchObj.group():",matchObj.group()print"matchObj.group(1):",matchObj.group(1)print"matchObj.group(2):",matchObj.group(2)else:print"Nomatch!!"正则表达式:
r'(.*)are(.*).*'解析:
首先,这是一个字符串,前面的一个r表示字符串为非转义的原始字符串,让编译器忽略反斜杠,也就是忽略转义字符。但是这个字符串里没有反斜杠,所以这个r可有可无。
matchObj.group()等同于matchObj.group(0),表示匹配到的完整文本字符
matchObj.group(1)得到第一组匹配结果,也就是(.*)匹配到的
matchObj.group(2)得到第二组匹配结果,也就是(.*)匹配到的
因为只有匹配结果中只有两组,所以如果填3时会报错。
CrazyDemo
444***899@qq.com
'(P...)'分组匹配
例:身份证1102231990xxxxxxxx
importres='1102231990xxxxxxxx'res=re.search('(P