码迷,mamicode.com
首页 > 编程语言 > 详细

python中的正则表达式

时间:2015-08-25 21:41:23      阅读:178      评论:0      收藏:0      [点我收藏+]

标签:正则表达式   总结   python   基础   

一、前奏:
1. 正则表达式:正则表达式是一种用来匹配字符串的强有力的武器。它的设计思想是用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,我们就认为它“匹配”了,否则,该字符串就是不合法的。


2.因为正则表达式也是用字符串表示的,所以,我们要首先了解如何用字符来描述字符,下面就是最常用的描述字符:
   \d:表示可以匹配一个数字,比如:‘00\d‘可以匹配‘001‘,‘\d\d\d‘可以匹配‘010‘
   \w:表示可以匹配一个字母或数字,比如:‘\w\w\w‘可以匹配‘abc‘
  以上的匹配都是精确匹配,也就是说是一个字母或者一个数字进行一一对应的匹配


3.那么,对于变长的匹配我们就需要用到其他的字符了,用*表示任意个字符(包括0个),用+表示至少一个字符,用?表示0个或1个字符,用{n}表示n个字符,用{n,m}表示n-m个字符,其实只要明白,这些符号相对应的作用,再加以练习就可以熟练使用了,理解倒不是很难。
例子:\d{3}\s+\w{3,8}:\d{3}表示三个数字组合,\s+至少有一个空格,\w{3,8}表示有3到8个字母


4.要做更精确地匹配,可以用[]表示范围

  (1).比如:[0-9a-zA-Z\_]可以匹配一个数字、字母或者下划线,注意这里下划线前面需要用一个\来进行转义字符;

       [0-9a-zA-Z\_]+可以匹配至少由一个数字、字母或者下划线组成的字符串,注意这里下划线前面需要用一个\来进行转义字符;

       [a-zA-Z\_][0-9a-zA-Z\_]*可以匹配由字母或下划线开头,后接任意个由一个数字、字母或者下划线组成的字符串;

       [a-zA-Z\_][0-9a-zA-Z\_]{0, 19}更精确地限制了变量的长度是1-20个字符(前面1个字符+后面最多19个字符);
        ^表示行的开头,^\d表示必须以数字开头。
       $表示行的结束,\d$表示必须以数字结束。
   (2).其实[]的作用就一个分隔符的作用,每个分隔符中间有所需的数字或者字母的范围,紧跟着的{}中的值是确定[]中的范围的。


二、使用:
 1.我们都是使用re模块中的match方法进行匹配的,re.match(r‘正则表达式‘,‘需要匹配的字符串‘),我们强烈建议使用Python的r前缀,就不用考虑转义的问题了。
 2.match()方法判断是否匹配,如果匹配成功,返回一个Match对象,否则返回None,一般我们可以把它用在if语句后面来进行是否匹配成功。
 
 举例:  import re,time
              a=input(‘请输入一个您要查询所属地的座机号码‘)
         if re.match(r‘[0-9]{4}[\-][0-9]{7}‘,a):
    print(‘您输入的号码正确请稍候,正在为您查询中...‘)
    time.sleep(3)
    print(‘您好,这是新疆的座机号码‘)
else:
    print(‘号码输入错误请重新输入‘)


>>> ================================ RESTART ================================
>>> 
请输入一个您要查询所属地的座机号码0993-6999720
您输入的号码正确请稍候,正在为您查询中...
您好,这是新疆的座机号码


 3.如果要匹配逗号,下划线这些特殊字符,在正则表达式中需要在前面加一个\。


三、切割字符串:
 1.我们可以用re.split(正则表达式,需要分割的字符串),在正则表达式中使用split,这里的正则表达式就被split当作分割字符串的依据了
 
 举例:>>> re.split(r‘[\s\;\,]+‘,‘as,sd    we;was;,;bi‘)
  
             [‘as‘, ‘sd‘, ‘we‘, ‘was‘, ‘bi‘]
    我们就可以用这种方法把不规范的输入转换为正确的列表输出


四、分组:
 1.除了简单地判断是否匹配之外,正则表达式还有提取子串的强大功能,用()表示的就是要提取的分组(Group),其实就是将原来的[]{}分用()的扩起来表示一个分组。
 
 举例: >>> m = re.match(r‘^([0-9]{4})-([0-9]{7})$‘,‘1111-6666666‘)
>>> m
<_sre.SRE_Match object; span=(0, 12), match=‘1111-6666666‘>
>>> m.group(1)
‘1111‘
>>> m.group(0)
‘1111-6666666‘
>>> m.group(2)
‘6666666‘
>>> m.groups()
(‘1111‘, ‘6666666‘)
 2.在正则表达式中遇到一个()就表明是一个分组,,每个()会对后面的字符串进行匹配,匹配成功的放入该分组中,在后面我们就可以用group进行截取各分组中匹配的值
注意group(0)表示全部截取,里面的参数是从0开始的,groups()以元组形式返回所有分组中匹配的值


五、贪婪匹配:
 1.对正则表达式进行分组匹配就会存在贪婪匹配,因为正则匹配默认是贪婪匹配,也就是匹配尽可能多的字符

 举例: >>> m = re.match(r‘^(\d+)(6*)$‘,‘1101016666666‘)
>>> m.groups()
(‘1101016666666‘, ‘‘)
 这样的话第一分组就会将字符串全部匹配完,所以第二个分组就是空值


 2.我们通过在第一个分组的最后面加一个问号?使得该分组采用非贪婪匹配

  举例: >>> m = re.match(r‘^(\d+?)(6*)$‘,‘1101016666666‘)
>>> m.groups()
(‘110101‘, ‘6666666‘)


六、编译:
 1.当我们在Python中使用正则表达式时,re模块内部会干两件事情:①、编译正则表达式,如果正则表达式的字符串本身不合法,会报错;
②、用编译后的正则表达式去匹配字符串。


 2.如果一个正则表达式要重复使用几千次,出于效率的考虑,我们可以预编译该正则表达式,接下来重复使用时就不需要编译这个步骤了
  直接匹配:   >>> m = re.compile(r‘^(\d+?)(6*)$‘)
                     >>> m.match(‘1231313666666‘).groups()
            (‘1231313‘, ‘666666‘)
  编译后生成m对象,由于该对象自己包含了正则表达式,所以调用对应的方法时不用给出正则字符串。


七、总结:
    对于正则表达式我觉得可以这样理解,所谓的匹配就是看需要检查的字符串是否满足你所写的正则规则,所谓的正则规则就是你定义的多种情况,比如说[com]*这个正则规则,*表示匹配0次或多次,所以这个正则规则我们可以理解为‘c’,‘com‘,‘co‘,‘om‘,‘comcom‘等多种由c,o,m组合的字符串,只要是这些情况都算匹配成功,
而[com]表示的就是(默认1次)只匹配‘com‘而对于前面所说的其他情况都是错的(注意如果括号里是固定字符串那么{n}表示匹配n次,比如(com){2}那么表示的是一定要匹配comcom才对),我觉得正则表达式其实就是一个检查的作用。

版权声明:本文为博主原创文章,未经博主允许不得转载。

python中的正则表达式

标签:正则表达式   总结   python   基础   

原文地址:http://blog.csdn.net/bx1246118099/article/details/47983125

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!