python正则表达式

import   re

re模块使python表达式拥有全部的正则表达式功能。

 

re.match(pattern, string, flags=0) 从字符串的起始位置匹配字符串,如果不是起始位置匹配成功,则返回none.如果匹配成功,返回一个匹配的对象

pattern:匹配的正则表达式

string:要匹配的字符串

flags:标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。

 

 

 

re.search(pattern, string, flags=0)扫描整个字符串并返回第一个成功的匹配

pattern:匹配的正则表达式

string:要匹配的字符串

flags:标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。

匹配成功re.search方法返回一个匹配的对象,否则返回None。

比如:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
import re
print(re.search('www', 'www.runoob.com').span())  # 在起始位置匹配                  (0, 3)
print(re.search('com', 'www.runoob.com').span())         # 不在起始位置匹配         (11, 14)

 

 

#!/usr/bin/python
import re
 
line = "Cats are smarter than dogs";
 
searchObj = re.search( r'(.*) are (.*?) .*', line, re.M|re.I)              #   re.M多行模式             re.I 忽略大小写
 
if searchObj:
   print "searchObj.group() : ", searchObj.group()            #Cats are smarter than dogs
   print "searchObj.group(1) : ", searchObj.group(1)        #Cats
   print "searchObj.group(2) : ", searchObj.group(2)        #smarter
else:
   print "Nothing found!!"

 

re.match和re.search的区别:

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

 

例如:

#!/usr/bin/python
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

 

检索和替换:re模块的re.sub用于替换字符串中的匹配项

re.sub(pattern, repl, string, count=0, flags=0)

pattern:正则中的模式字符串。

repl : 替换的字符串,也可为一个函数。

string:要被查找替换的原始字符串。

count:模式匹配后替换的最大次数,默认0表示替换所有的匹配。

 

#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
import re
 
phone = "2004-959-559 # 这是一个国外电话号码"
 
# 删除字符串中的 Python注释
num = re.sub(r'#.*$', "", phone)
print "电话号码是: ", num                #   电话号码是 :  2004-959-559
 
# 删除非数字(-)的字符串
num = re.sub(r'\D', "", phone)       #     \D匹配任意非数字
print "电话号码是 : ", num            #    电话号码是 :  2004959559

 

repl是一个函数

 

标点符号只有被转义时才匹配自身,否则它们表示特殊的含义。

反斜杠本身需要使用反斜杠转义

 

^匹配字符串的开头

$匹配字符串的结尾

. 匹配任意字符,除了换行符

[......] 用来表示一组字符,单独列出   [amk] 匹配 'a','m'或'k'

[^......]  不在[  ] 中的字符  [^abc] 匹配除了a,b,c之外的字符。

re*   匹配0个或多个表达式

re+   匹配1个或多个表达式

\d    匹配任意数字

\D   匹配任意非数字

\s   匹配任意空白字符    等价于 [\t\n\r\f].

\S  匹配任意非空字符

\A  匹配字符串开始

\Z  匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串

\z  匹配字符串结束

 

 

r'(.*) are (.*?) .*'    首先,这是一个字符串,前面的一个 r 表示字符串为非转义的原始字符串,让编译器忽略反斜杠,也就是忽略转义字符。但是这个字符串里没有反斜杠,所以这个 r 可有可无。

(.*) 第一个匹配分组,.* 代表匹配除换行符之外的所有字符。
(.*?) 第二个匹配分组,.*? 后面多个问号,代表非贪婪模式,也就是说只匹配符合条件的最少字符
后面的一个 .* 没有括号包围,所以不是分组,匹配效果和第一个一样,但是不计入匹配结果中。

matchObj.group() 等同于 matchObj.group(0),表示匹配到的完整文本字符

matchObj.group(1) 得到第一组匹配结果,也就是(.*)匹配到的

matchObj.group(2) 得到第二组匹配结果,也就是(.*?)匹配到的

因为只有匹配结果中只有两组,所以如果填 3 时会报错。

posted on 2017-10-23 15:49  步行者811  阅读(154)  评论(0编辑  收藏  举报

导航