设为首页 收藏本站
查看: 1034|回复: 0

[经验分享] Python正则表达式(三)

[复制链接]

尚未签到

发表于 2017-4-29 11:29:43 | 显示全部楼层 |阅读模式
  2 re模块的基本函数
  在上面的说明中,我们已经对re模块的基本函数 ‘findall’很熟悉了。当然如果光有findall的话,很多功能是不能实现的。下面开始介绍一下re模块其它的常用基本函数。灵活搭配使用这些函数,才能充分发挥Python正则式的强大功能。
  首先还是说下老熟人findall函数吧
  findall(rule , target [,flag] )
  在目标字符串中查找符合规则的字符串。
  第一个参数是规则,第二个参数是目标字符串,后面还可以跟一个规则选项(选项功能将在compile函数的说明中详细说明)。
  返回结果结果是一个列表,中间存放的是符合规则的字符串。如果没有符合规则的字符串被找到,就返回一个空列表。
  2.1 使用compile加速
  compile( rule [,flag] )
  将正则规则编译成一个Pattern对象,以供接下来使用。
  第一个参数是规则式,第二个参数是规则选项。
  返回一个Pattern对象
  直接使用findall ( rule , target )的方式来匹配字符串,一次两次没什么,如果是多次使用的话,由于正则引擎每次都要把规则解释一遍,而规则的解释又是相当费时间的,所以这样的效率就很低了。如果要多次使用同一规则来进行匹配的话,可以使用re.compile函数来将规则预编译,使用编译过返回的Regular Expression Object或叫做Pattern对象来进行查找。
  例
  >>> s='111,222,aaa,bbb,ccc333,444ddd'
  >>> rule=r’/b/d+/b’
  >>> compiled_rule=re.compile(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=re.compile(r’^/d+’) #匹配一个位于开头的数字,没有使用M选项
  >>> rc.findall(s)
  ['123'] #结果只能找到位于第一个行首的’123’
  >>> rcm=re.compile(r’^/d+’,re.M) #使用 M 选项
  >>> rcm.findall(s)
  ['123', '789', '345'] #找到了三个行首的数字
  同样,对于’$’来说,没有使用M选项,它将匹配最后一个行尾的数字,即’678’,加上以后,就能匹配三个行尾的数字456 012和678了.
  >>> rc=re.compile(r’/d+$’)
  >>> rcm=re.compile(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 = re.compile(r"/d+|[a-zA-Z]+") #匹配一个数字或者单词
使用X选项写成:
  >>> rc = re.compile(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 )
  ['(*+?)']

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-370733-1-1.html 上篇帖子: python中的generator解读 下篇帖子: Python使用ReportLab画图
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表