志在指尖
用双手敲打未来

Python 正则表达式

正则表达式是一个特别的字符序列,它能帮助你方便的查看一个字符串是否与某种方法匹配。
Python自1.5版本起添加了re模块,它供给Perl风格的正则表达式方法。
re模块使Python言语具有悉数的正则表达式功能。
compile函数依据一个方法字符串和可选的标志参数生成一个正则表达式目标。该目标具有一系列办法用于正则表达式匹配和替换。
re模块也供给了与这些办法功能完全一致的函数,这些函数运用一个方法字符串做为它们的榜首个参数。
本章节主要介绍Python中常用的正则表达式处理函数。
re.match函数
re.match测验从字符串的开端方位匹配一个方法,假如不是开端方位匹配成功的话,match()就回来none。
函数语法:
re.match(pattern,string,flags=0)
函数参数阐明:
参数描绘
pattern匹配的正则表达式
string要匹配的字符串。
flags标志位,用于操控正则表达式的匹配办法,如:是否差异大小写,多行匹配等等。拜见:正则表达式修饰符-可选标志
匹配成功re.match办法回来一个匹配的目标,不然回来None。
咱们能够运用group(num)或groups()匹配目标函数来获取匹配表达式。
匹配目标办法描绘
group(num=0)匹配的整个表达式的字符串,group()能够一次输入多个组号,在这种情况下它将回来一个包含那些组所对应值的元组。
groups()回来一个包含一切小组字符串的元组,从1到所含的小组号。
实例
#!/usr/bin/python#-*-coding:UTF-8-*-importreprint(re.match(‘www’,’www.runoob.com’).span())#在开端方位匹配print(re.match(‘com’,’www.runoob.com’))#不在开端方位匹配
以上实例运转输出成果为:
(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():Catsaresmarterthandogs
matchObj.group(1):CatsmatchObj.group(2):smarter
re.search办法
re.search扫描整个字符串并回来榜首个成功的匹配。
函数语法:
re.search(pattern,string,flags=0)
函数参数阐明:
参数描绘
pattern匹配的正则表达式
string要匹配的字符串。
flags标志位,用于操控正则表达式的匹配办法,如:是否差异大小写,多行匹配等等。
匹配成功re.search办法回来一个匹配的目标,不然回来None。
咱们能够运用group(num)或groups()匹配目标函数来获取匹配表达式。
匹配目标办法描绘
group(num=0)匹配的整个表达式的字符串,group()能够一次输入多个组号,在这种情况下它将回来一个包含那些组所对应值的元组。
groups()回来一个包含一切小组字符串的元组,从1到所含的小组号。
实例
#!/usr/bin/python#-*-coding:UTF-8-*-importreprint(re.search(‘www’,’www.runoob.com’).span())#在开端方位匹配print(re.search(‘com’,’www.runoob.com’).span())#不在开端方位匹配
以上实例运转输出成果为:
(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():Catsaresmarterthandogs
searchObj.group(1):CatssearchObj.group(2):smarter
re.match与re.search的差异
re.match只匹配字符串的开端,假如字符串开端不符合正则表达式,则匹配失利,函数回来None;而re.search匹配整个字符串,直到找到一个匹配。
实例
#!/usr/bin/pythonimportreline=”Catsaresmarterthandogs”;matchObj=re.match(r’dogs’,line,re.M|re.I)ifmatchObj:print”match–>matchObj.group():”,matchObj.group()else:print”Nomatch!!”matchObj=re.search(r’dogs’,line,re.M|re.I)ifmatchObj:print”search–>searchObj.group():”,matchObj.group()else:print”Nomatch!!”
以上实例运转成果如下:
Nomatch!!search–>searchObj.group():dogs
检索和替换
Python的re模块供给了re.sub用于替换字符串中的匹配项。
语法:
re.sub(pattern,repl,string,count=0,flags=0)
参数:
pattern:正则中的方法字符串。
repl:替换的字符串,也可为一个函数。
string:要被查找替换的原始字符串。
count:方法匹配后替换的最大次数,默许0表明替换一切的匹配。
实例
#!/usr/bin/python#-*-coding:UTF-8-*-importrephone=”2004-959-559#这是一个国外电话号码”#删去字符串中的Python注释num=re.sub(r’#.*$’,””,phone)print”电话号码是:”,num#删去非数字(-)的字符串num=re.sub(r’\D’,””,phone)print”电话号码是:”,num
以上实例履行成果如下:
电话号码是:2004-959-559电话号码是:2004959559
repl参数是一个函数
以下实例中将字符串中的匹配的数字乘以2:
实例
#!/usr/bin/python#-*-coding:UTF-8-*-importre#将匹配的数字乘以2defdouble(matched):value=int(matched.group(‘value’))returnstr(value*2)s=’A23G4HFD567’print(re.sub(‘(?P\d+)’,double,s))
履行输出成果为:
A46G8HFD1134
re.compile函数
compile函数用于编译正则表达式,生成一个正则表达式(Pattern)目标,供match()和search()这两个函数运用。
语法格式为:
re.compile(pattern[,flags])
参数:
pattern:一个字符串方法的正则表达式
flags:可选,表明匹配方法,比如疏忽大小写,多行方法等,具体参数为:
re.I疏忽大小写
re.L表明特别字符集\w,\W,\b,\B,\s,\S依赖于当时环境
re.M多行方法
re.S即为.并且包含换行符在内的恣意字符(.不包含换行符)
re.U表明特别字符集\w,\W,\b,\B,\d,\D,\s,\S依赖于Unicode字符属性数据库
re.X为了添加可读性,疏忽空格和#后边的注释
实例
实例
>>>importre>>>pattern=re.compile(r’\d+’)#用于匹配至少一个数字>>>m=pattern.match(‘one12twothree34four’)#查找头部,没有匹配>>>printmNone>>>m=pattern.match(‘one12twothree34four’,2,10)#从’e’的方位开端匹配,没有匹配>>>printmNone>>>m=pattern.match(‘one12twothree34four’,3,10)#从’1’的方位开端匹配,正好匹配>>>printm#回来一个Match目标<_sre.SRE_Matchobjectat0x10a42aac0>>>>m.group(0)#可省掉0’12’>>>m.start(0)#可省掉03>>>m.end(0)#可省掉05>>>m.span(0)#可省掉0(3,5)
在上面,当匹配成功时回来一个Match目标,其间:
group([group1,…])办法用于取得一个或多个分组匹配的字符串,当要取得整个匹配的子串时,可直接运用group()或group(0);
start([group])办法用于获取分组匹配的子串在整个字符串中的开端方位(子串榜首个字符的索引),参数默许值为0;
end([group])办法用于获取分组匹配的子串在整个字符串中的完毕方位(子串最后一个字符的索引+1),参数默许值为0;
span([group])办法回来(start(group),end(group))。
再看看一个例子:
实例
>>>importre>>>pattern=re.compile(r'([a-z]+)([a-z]+)’,re.I)#re.I表明疏忽大小写>>>m=pattern.match(‘HelloWorldWideWeb’)>>>printm#匹配成功,回来一个Match目标<_sre.SRE_Matchobjectat0x10bea83e8>>>>m.group(0)#回来匹配成功的整个子串’HelloWorld’>>>m.span(0)#回来匹配成功的整个子串的索引(0,11)>>>m.group(1)#回来榜首个分组匹配成功的子串’Hello’>>>m.span(1)#回来榜首个分组匹配成功的子串的索引(0,5)>>>m.group(2)#回来第二个分组匹配成功的子串’World’>>>m.span(2)#回来第二个分组匹配成功的子串(6,11)>>>m.groups()#等价于(m.group(1),m.group(2),…)(‘Hello’,’World’)>>>m.group(3)#不存在第三个分组Traceback(mostrecentcalllast):File””,line1,in<module>IndexError:nosuchgroup
findall
在字符串中找到正则表达式所匹配的一切子串,并回来一个列表,假如没有找到匹配的,则回来空列表。
注意:match和search是匹配一次findall匹配一切。
语法格式为:
findall(string[,pos[,endpos]])
参数:
string:待匹配的字符串。
pos:可选参数,指定字符串的开端方位,默许为0。
endpos:可选参数,指定字符串的完毕方位,默许为字符串的长度。
查找字符串中的一切数字:
实例
#-*-coding:UTF8-*-importrepattern=re.compile(r’\d+’)#查找数字result1=pattern.findall(‘runoob123google456’)result2=pattern.findall(‘run88oob123google456’,0,10)print(result1)print(result2)
输出成果:
[‘123′,’456′][’88’,’12’]
re.finditer
和findall相似,在字符串中找到正则表达式所匹配的一切子串,并把它们作为一个迭代器回来。
re.finditer(pattern,string,flags=0)
参数:
参数描绘
pattern匹配的正则表达式
string要匹配的字符串。
flags标志位,用于操控正则表达式的匹配办法,如:是否差异大小写,多行匹配等等。拜见:正则表达式修饰符-可选标志
实例
#-*-coding:UTF-8-*-importreit=re.finditer(r”\d+”,”12a32bc43jf3″)formatchinit:print(match.group())
输出成果:
1232433
re.split
split办法依照能够匹配的子串将字符串切割后回来列表,它的运用方法如下:
re.split(pattern,string[,maxsplit=0,flags=0])
参数:
参数描绘
pattern匹配的正则表达式
string要匹配的字符串。
maxsplit分隔次数,maxsplit=1分隔一次,默许为0,不约束次数。
flags标志位,用于操控正则表达式的匹配办法,如:是否差异大小写,多行匹配等等。拜见:正则表达式修饰符-可选标志
实例
>>>importre>>>re.split(‘\W+’,’runoob,runoob,runoob.’)[‘runoob’,’runoob’,’runoob’,”]>>>re.split(‘(\W+)’,’runoob,runoob,runoob.’)[”,”,’runoob’,’,’,’runoob’,’,’,’runoob’,’.’,”]>>>re.split(‘\W+’,’runoob,runoob,runoob.’,1)[”,’runoob,runoob,runoob.’]>>>re.split(‘a*’,’helloworld’)#对于一个找不到匹配的字符串而言,split不会对其作出切割[‘helloworld’]
正则表达式目标
re.RegexObject
re.compile()回来RegexObject目标。
re.MatchObject
group()回来被RE匹配的字符串。
start()回来匹配开端的方位
end()回来匹配完毕的方位
span()回来一个元组包含匹配(开端,完毕)的方位
正则表达式修饰符-可选标志
正则表达式能够包含一些可选标志修饰符来操控匹配的方法。修饰符被指定为一个可选的标志。多个标志能够经过按位OR(|)它们来指定。如re.I|re.M被设置成I和M标志:
修饰符描绘
re.I使匹配对大小写不敏感
re.L做本地化辨认(locale-aware)匹配
re.M多行匹配,影响^和$
re.S使.匹配包含换行在内的一切字符
re.U依据Unicode字符集解析字符。这个标志影响\w,\W,\b,\B.
re.X该标志经过给予你更灵敏的格式以便你将正则表达式写得更易于了解。
正则表达式方法
方法字符串运用特别的语法来表明一个正则表达式:
字母和数字表明他们本身。一个正则表达式方法中的字母和数字匹配同样的字符串。
大都字母和数字前加一个反斜杠时会具有不同的意义。
标点符号只要被转义时才匹配本身,不然它们表明特别的意义。
反斜杠本身需要运用反斜杠转义。
因为正则表达式通常都包含反斜杠,所以你最好运用原始字符串来表明它们。方法元素(如r’\t’,等价于’\\t’)匹配相应的特别字符。
下表列出了正则表达式方法语法中的特别元素。假如你运用方法的一起供给了可选的标志参数,某些方法元素的意义会改变。
方法描绘
^匹配字符串的开头
$匹配字符串的末尾。
.匹配恣意字符,除了换行符,当re.DOTALL标记被指守时,则能够匹配包含换行符的恣意字符。
[…]用来表明一组字符,独自列出:[amk]匹配’a’,’m’或’k’
[^…]不在[]中的字符:[^abc]匹配除了a,b,c之外的字符。
re*匹配0个或多个的表达式。
re+匹配1个或多个的表达式。
re?匹配0个或1个由前面的正则表达式界说的片段,非贪婪办法
re{n}准确匹配n个前面表达式。例如,o{2}不能匹配”Bob”中的”o”,但是能匹配”food”中的两个o。
re{n,}匹配n个前面表达式。例如,o{2,}不能匹配”Bob”中的”o”,但能匹配”foooood”中的一切o。”o{1,}”等价于”o+”。”o{0,}”则等价于”o*”。
re{n,m}匹配n到m次由前面的正则表达式界说的片段,贪婪办法
a|b匹配a或b
(re)对正则表达式分组并记住匹配的文本
(imx)正则表达式包含三种可选标志:i,m,或x。只影响括号中的区域。
(-imx)正则表达式封闭i,m,或x可选标志。只影响括号中的区域。
(:re)相似(…),但是不表明一个组
(imx:re)在括号中运用i,m,或x可选标志
(-imx:re)在括号中不运用i,m,或x可选标志
(#…)注释.
(=re)前向必定界定符。假如所含正则表达式,以…表明,在当时方位成功匹配时成功,不然失利。但一旦所含表达式已经测验,匹配引擎底子没有提高;方法的剩下部分还要测验界定符的右边。
(!re)前向否定界定符。与必定界定符相反;当所含表达式不能在字符串当时方位匹配时成功
(>re)匹配的独立方法,省去回溯。
\w匹配字母数字及下划线
\W匹配非字母数字及下划线
\s匹配恣意空白字符,等价于[\t\n\r\f]。
\S匹配恣意非空字符
\d匹配恣意数字,等价于[0-9].
\D匹配恣意非数字
\A匹配字符串开端
\Z匹配字符串完毕,假如是存在换行,只匹配到换行前的完毕字符串。
\z匹配字符串完毕
\G匹配最后匹配完结的方位。
\b匹配一个单词鸿沟,也就是指单词和空格间的方位。例如,’er\b’能够匹配”never”中的’er’,但不能匹配”verb”中的’er’。
\B匹配非单词鸿沟。’er\B’能匹配”verb”中的’er’,但不能匹配”never”中的’er’。
\n,\t,等.匹配一个换行符。匹配一个制表符。等
\1…\9匹配第n个分组的内容。
\10匹配第n个分组的内容,假如它经匹配。不然指的是八进制字符码的表达式。
正则表达式实例
字符匹配
实例描绘
python匹配”python”.
字符类
实例描绘
[Pp]ython匹配”Python”或”python”
rub[ye]匹配”ruby”或”rube”
[aeiou]匹配中括号内的恣意一个字母
[0-9]匹配任何数字。相似于[0123456789]
[a-z]匹配任何小写字母
[A-Z]匹配任何大写字母
[a-zA-Z0-9]匹配任何字母及数字
[^aeiou]除了aeiou字母以外的一切字符
[^0-9]匹配除了数字外的字符
特别字符类
实例描绘
.匹配除”\n”之外的任何单个字符。要匹配包含’\n’在内的任何字符,请运用象'[.\n]’的方法。
\d匹配一个数字字符。等价于[0-9]。
\D匹配一个非数字字符。等价于[^0-9]。
\s匹配任何空白字符,包含空格、制表符、换页符等等。等价于[\f\n\r\t\v]。
\S匹配任何非空白字符。等价于[^\f\n\r\t\v]。
\w匹配包含下划线的任何单词字符。等价于'[A-Za-z0-9_]’。
\W匹配任何非单词字符。等价于'[^A-Za-z0-9_]’。

未经允许不得转载:IT技术网站 » Python 正则表达式
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

志在指尖 用双手敲打未来

登录/注册IT技术大全

热门IT技术

C#基础入门   SQL server数据库   系统SEO学习教程   WordPress小技巧   WordPress插件   脚本与源码下载