收藏 分销(赏)

Python正则表达式模块re讲解.doc

上传人:仙人****88 文档编号:9450270 上传时间:2025-03-26 格式:DOC 页数:7 大小:67.50KB
下载 相关 举报
Python正则表达式模块re讲解.doc_第1页
第1页 / 共7页
Python正则表达式模块re讲解.doc_第2页
第2页 / 共7页
点击查看更多>>
资源描述
2 re模块的基本函数 在上面的说明中,我们已经对re模块的基本函数 ‘findall’很熟悉了。当然如果光有findall的话,很多功能是不能实现的。下面开始介绍一下re模块其它的常用基本函数。灵活搭配使用这些函数,才能充分发挥Python正则式的强大功能。 首先还是说下老熟人findall函数吧 findall(rule , target [,flag] ) 在目标字符串中查找符合规则的字符串。 第一个参数是规则,第二个参数是目标字符串,后面还可以跟一个规则选项(选项功能将在compile函数的说明中详细说明)。 返回结果结果是一个列表,中间存放的是符合规则的字符串。如果没有符合规则的字符串被找到,就返回一个空列表。 2.1 使用compile加速 compile( rule [,flag] ) 将正则规则编译成一个Pattern对象,以供接下来使用。 第一个参数是规则式,第二个参数是规则选项。 返回一个Pattern对象 直接使用findall ( rule , target )的方式来匹配字符串,一次两次没什么,如果是多次使用的话,由于正则引擎每次都要把规则解释一遍,而规则的解释又是相当费时间的,所以这样的效率就很低了。如果要多次使用同一规则来进行匹配的话,可以使用pile函数来将规则预编译,使用编译过返回的Regular Expression Object或叫做Pattern对象来进行查找。 >>> s='111,222,aaa,bbb,ccc333,444ddd' >>> rule=r’\b\d+\b’ >>> compiled_rule=pile(rule) >>> compiled_rule.findall(s) ['111', '222'] 可见使用compile过的规则使用和未编译的使用很相似。compile函数还可以指定一些规则标志,来指定一些特殊选项。多个选项之间用 ’|’(位或)连接起来。 I      IGNORECASE 忽略大小写区别。   L   LOCAL  字符集本地化。这个功能是为了支持多语言版本的字符集使用环境的,比如在转义符\w,在英文环境下,它代表[a-zA-Z0-9],即所以英文字符和数字。如果在一个法语环境下使用,缺省设置下,不能匹配"é" 或 "ç"。加上这L选项和就可以匹配了。不过这个对于中文环境似乎没有什么用,它仍然不能匹配中文字符。   M    MULTILINE  多行匹配。在这个模式下’^’(代表字符串开头)和’$’(代表字符串结尾)将能够匹配多行的情况,成为行首和行尾标记。比如 >>> s=’123 456\n789 012\n345 678’ >>> rc=pile(r’^\d+’)    #匹配一个位于开头的数字,没有使用M选项 >>> rc.findall(s) ['123']             #结果只能找到位于第一个行首的’123’ >>> rcm=pile(r’^\d+’,re.M)       #使用 M 选项 >>> rcm.findall(s) ['123', '789', '345']  #找到了三个行首的数字 同样,对于’$’来说,没有使用M选项,它将匹配最后一个行尾的数字,即’678’,加上以后,就能匹配三个行尾的数字456 012和678了. >>> rc=pile(r’\d+$’) >>> rcm=pile(r’\d+$’,re.M) >>> rc.findall(s) ['678'] >>> rcm.findall(s) ['456', '012', '678']   S     DOTALL       ‘.’号将匹配所有的字符。缺省情况下’.’匹配除换行符’\n’外的所有字符,使用这一选项以后,’.’就能匹配包括’\n’的任何字符了。   U   UNICODE       \w, \W, \b, \B, \d, \D, \s 和 \S都将使用Unicode。   X     VERBOSE     这个选项忽略规则表达式中的空白,并允许使用’#’来引导一个注释。这样可以让你把规则写得更美观些。比如你可以把规则 >>> rc = pile(r"\d+|[a-zA-Z]+")       #匹配一个数字或者单词 使用X选项写成: >>> rc = pile(r"""  # start a rule \d+                   # number | [a-zA-Z]+           # word """, re.VERBOSE) 在这个模式下,如果你想匹配一个空格,你必须用'\ '的形式('\'后面跟一个空格)     2.2 match与search match( rule , targetString [,flag] ) search( rule , targetString [,flag] ) (注:re的match 与search函数同compile过的Pattern对象的match与search函数的参数是不一样的。Pattern对象的match与search函数更为强大,是真正最常用的函数) 按照规则在目标字符串中进行匹配。 第一个参数是正则规则,第二个是目标字符串,第三个是选项(同compile函数的选项) 返回:若成功返回一个Match对象,失败无返回 findall虽然很直观,但是在进行更复杂的操作时,就有些力不从心了。此时更多的使用的是match和search函数。他们的参数和findall是一样的,都是: match( rule , targetString [,flag] ) search( rule , targetString [,flag] ) 不过它们的返回不是一个简单的字符串列表,而是一个MatchObject (如果匹配成功的话).。通过操作这个matchObject,我们可以得到更多的信息。 需要注意的是,如果匹配不成功,它们则返回一个NoneType。所以在对匹配完的结果进行操作之前,你必需先判断一下是否匹配成功了,比如: >>> m=re.match( rule , target ) >>> if m:                       #必需先判断是否成功         doSomethin 这两个函数唯一的区别是:match从字符串的开头开始匹配,如果开头位置没有匹配成功,就算失败了;而search会跳过开头,继续向后寻找是否有匹配的字符串。针对不同的需要,可以灵活使用这两个函数。 关于match返回的MatchObject如果使用的问题,是Python正则式的精髓所在,它与组的使用密切相关。我将在下一部分详细讲解,这里只举个最简单的例子: 例: >>> s= 'Tom:9527 , Sharry:0003' >>> m=re.match( r'(?P<name>\w+):(?P<num>\d+)' , s ) >>> m.group() 'Tom:9527' >>> m.groups() ('Tom', '9527') >>> m.group(‘name’) 'Tom' >>> m.group(‘num’) '9527'   2.3 finditer finditer( rule , target [,flag] ) 参数同findall 返回一个迭代器 finditer函数和findall函数的区别是,findall返回所有匹配的字符串,并存为一个列表,而finditer则并不直接返回这些字符串,而是返回一个迭代器。关于迭代器,解释起来有点复杂,还是看看例子把: >>> s=’111 222 333 444’ >>> for i in re.finditer(r’\d+’ , s ):         print i.group(),i.span()          #打印每次得到的字符串和起始结束位置 结果是 111 (0, 3) 222 (4, 7) 333 (8, 11) 444 (12, 15) 简单的说吧,就是finditer返回了一个可调用的对象,使用 for i in finditer()的形式,可以一个一个的得到匹配返回的 Match对象。这在对每次返回的对象进行比较复杂的操作时比较有用。   2.4 字符串的替换和修改 re模块还提供了对字符串的替换和修改函数,他们比字符串对象提供的函数功能要强大一些。这几个函数是 sub ( rule , replace , target [,count] ) subn(rule , replace , target [,count] ) 在目标字符串中规格规则查找匹配的字符串,再把它们替换成指定的字符串。你可以指定一个最多替换次数,否则将替换所有的匹配到的字符串。 第一个参数是正则规则,第二个参数是指定的用来替换的字符串,第三个参数是目标字符串,第四个参数是最多替换次数。 这两个函数的唯一区别是返回值。 sub返回一个被替换的字符串 sub返回一个元组,第一个元素是被替换的字符串,第二个元素是一个数字,表明产生了多少次替换。 例,将下面字符串中的’dog’全部替换成’cat’ >>> s=’ I have a dog , you have a dog , he have a dog ‘ >>> re.sub( r’dog’ , ‘cat’ , s ) ' I have a cat , you have a cat , he have a cat ' 如果我们只想替换前面两个,则 >>> re.sub( r’dog’ , ‘cat’ , s , 2 ) ' I have a cat , you have a cat , he have a dog ' 或者我们想知道发生了多少次替换,则可以使用subn >>> re.subn( r’dog’ , ‘cat’ , s ) (' I have a cat , you have a cat , he have a cat ', 3)   split( rule , target [,maxsplit] ) 切片函数。使用指定的正则规则在目标字符串中查找匹配的字符串,用它们作为分界,把字符串切片。 第一个参数是正则规则,第二个参数是目标字符串,第三个参数是最多切片次数 返回一个被切完的子字符串的列表 这个函数和str对象提供的split函数很相似。举个例子,我们想把上例中的字符串被’,’分割开,同时要去掉逗号前后的空格 >>> s=’ I have a dog   ,   you have a dog  ,  he have a dog ‘ >>> re.split( ‘\s*,\s*’ , s ) [' I have a dog', 'you have a dog', 'he have a dog '] 结果很好。如果使用str对象的split函数,则由于我们不知道’,’两边会有多少个空格,而不得不对结果再进行一次处理。   escape( string ) 这是个功能比较古怪的函数,它的作用是将字符串中的non-alphanumerics字符(我已不知道该怎么翻译比较好了)用反义字符的形式显示出来。有时候你可能希望在正则式中匹配一个字符串,不过里面含有很多re使用的符号,你要一个一个的修改写法实在有点麻烦,你可以使用这个函数, 例 在目标字符串s中匹配’(*+?)’这个子字符串 >>> s= ‘111 222 (*+?) 333’ >>> rule= re.escape( r’(*+?)’ ) >>> print rule \(\*\+\?\) >>> re.findall( rule , s ) ['(*+?)'] 3     更深入的了解re的组与对象 前面对Python正则式的组进行了一些简单的介绍,由于还没有介绍到match对象,而组又是和match对象密切相关的,所以必须将它们结合起来介绍才能充分地说明它们的用途。 不过再详细介绍它们之前,我觉得有必要先介绍一下将规则编译后的生成的patter对象 3.1编译后的Pattern对象 将一个正则式,使用compile函数编译,不仅是为了提高匹配的速度,同时还能使用一些附加的功能。编译后的结果生成一个Pattern对象,这个对象里面有很多函数,他们看起来和re模块的函数非常象,它同样有findall , match , search ,finditer , sub , subn , split 这些函数,只不过它们的参数有些小小的不同。一般说来,re模块函数的第一个参数,即正则规则不再需要了,应为规则就包含在Pattern对象中了,编译选项也不再需要了,因为已经被编译过了。因此re模块中函数的这两个参数的位置,就被后面的参数取代了。 findall , match , search 和finditer这几个函数的参数是一样的,除了少了规则和选项两个参数外,它们又加入了另外两个参数,它们是:查找开始位置和查找结束位置,也就是说,现在你可以指定查找的区间,除去你不感兴趣的区间。它们现在的参数形式是: findall ( targetString [, startPos [,endPos] ] ) finditer ( targetString [, startPos [,endPos] ] ) match ( targetString [, startPos [,endPos] ] ) search ( targetString [, startPos [,endPos] ] ) 这些函数的使用和re模块的同名函数使用完全一样。所以就不多介绍了。   除了和re模块的函数同样的函数外,Pattern对象还多了些东西,它们是: flags       查询编译时的选项 pattern 查询编译时的规则 groupindex 规则里的组 这几个不是函数,而是一个值。它们提供你一些规则的信息。比如下面这个例子 >>> p=pile( r'(?P<word>\b[a-z]+\b)|(?P<num>\b\d+\b)|(?P<id>\b[a-z_]+\w*\b)' , re.I ) >>> p.flags 2 >>> p.pattern '(?P<word>\\b[a-z]+\\b)|(?P<num>\\b\\d+\\b)|(?P<id>\\b[a-z_]+\\w*\\b)' >>> p.groupindex {'num': 2, 'word': 1, 'id': 3} 我们来分析一下这个例子:这个正则式是匹配单词、或数字、或一个由字母或’_’开头,后面接字母或数字的一个ID。我们给这三种情况的规则都包入了一个命名组,分别命名为’word’ , ‘num’ 和 ‘id’。我们规定大小写不敏感,所以使用了编译选项 ‘I’。 编译以后返回的对象为p,通过p.flag我们可以查看编译时的选项,不过它显示的不是’I’,而是一个数值2 。其实re.I是一个整数,2就是它的值。我们可以查看一下: >>> re.I 2 >>> re.L 4 >>> re.M 8 … 每个选项都是一个数值。 通过p.pattern可以查看被编译的规则是什么。使用print的话会更好看一些 >>> print p.pattern (?P<word>\b[a-z]+\b)|(?P<num>\b\d+\b)|(?P<id>\b[a-z_]+\w*\b) 看,和我们输入的一样。 接下来的p.groupindex则是一个字典,它包含了规则中的所有命名组。字典的key是名字,values是组的序号。由于字典是以名字作为key,所以一个无命名的组不会出现在这里。     3.2 组与Match对象 组与Match对象是Python正则式的重点。只有掌握了组和Match对象的使用,才算是真正学会了Python正则式。 3.2.1 组的名字与序号 正则式中的每个组都有一个序号,它是按定义时从左到右的顺序从1开始编号的。其实,re的正则式还有一个0号组,它就是整个正则式本身。 我们来看个例子 >>> p=pile( r’(?P<name>[a-z]+)\s+(?P<age>\d+)\s+(?P<tel>\d+).*’ , re.I ) >>> p.groupindex {'age': 2, 'tel': 3, 'name': 1} >>> s=’Tom 24 88888888  <=’ >>> m=p.search(s) >>> m.groups()                           # 看看匹配的各组的情况 ('Tom', '24', '8888888') >>> m.group(‘name’)                   # 使用组名获取匹配的字符串 ‘Tom’ >>> m.group( 1 )                         # 使用组序号获取匹配的字符串,同使用组名的效果一样 >>> m.group(0)                           # 0 组里面是什么呢? 'Tom 24 88888888  <=' 原来0组就是整个正则式,包括没有被包围到组里面的内容。当获取0组的时候,你可以不写这个参数。m.group(0)和m.group()的效果是一样的: >>> m.group() 'Tom 24 88888888  <='   接下来看看更多的Match对象的方法,看看我们能做些什么。 3.2.2 Match对象的方法 group([index|id]) 获取匹配的组,缺省返回组0,也就是全部值 groups()               返回全部的组 groupdict()           返回以组名为key,匹配的内容为values的字典 接上例: >>> m.groupindex() {'age': '24', 'tel': '88888888', 'name': 'Tom'} start( [group] )     获取匹配的组的开始位置 end( [group] )              获取匹配的组的结束位置 span( [group] )     获取匹配的组的(开始,结束)位置   expand( template ) 根据一个模版用找到的内容替换模版里的相应位置 这个功能比较有趣,它根据一个模版来用匹配到的内容替换模版中的相应位置,组成一个新的字符串返回。它使用\g<index|name>或 \index 来指示一个组。 接上例 >>> m.expand(r'name is \g<1> , age is \g<age> , tel is \3') 'name is Tom , age is 24 , tel is 88888888'   除了以上这些函数外,Match对象还有些属性 pos         搜索开始的位置参数 endpos  搜索结束的位置参数 这两个是使用findall或match等函数时,传入的参数。在上面这个例子里,我们没有指定开始和结束位置,那么缺省的开始位置就是0,结束位置就是最后。 >>> m.pos 0 >>> m.endpos 19 lastindex 最后匹配的组的序号 >>> m.lastindex 3 lastgroup       最后匹配的组名 >>> m.lastgroup 'tel' re    产生这个匹配的Pattern对象,可以认为是个逆引用 >>> m.re.pattern '(?P<name>[a-z]+)\\s+(?P<age>\\d+)\\s+(?P<tel>\\d+).*' 得到了产生这个匹配的规则 string 匹配的目标字符串 >>> m.string 'Tom 24 88888888  <=' 第 7 页 共 7 页
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传
相似文档                                   自信AI助手自信AI助手

当前位置:首页 > 教育专区 > 小学其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服