Python学习 (九 正则表达式)

来源:互联网 发布:啊哈算法 在线阅读 编辑:程序博客网 时间:2024/06/15 00:31

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

re.match函数

re模块使 Python 语言拥有全部的正则表达式功能。re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,就返回none,也含着TrueFalse的判断。

re.match(pattern, string, flags=0)#有以下使用方式test = '用户输入的字符串'if re.match(r'正则表达式', test):    print 'ok'else:    print 'failed'

pattern是匹配的正则表达式,string是要匹配的字符串,flags作为默认参数是标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。
由于Python的字符串本身也用\转义,所以要特别注意:

s = 'ABC\\-001' # Python的字符串# 对应的正则表达式字符串变成:# 'ABC\-001'

强烈建议使用Python的r前缀,就不用考虑转义的问题了:

s = r'ABC\-001' # Python的字符串# 对应的正则表达式字符串不变:# 'ABC\-001' 不过有一个问题是单双引号,这个还是得根据实际情况判别

切分字符串

用正则表达式切分字符串比用固定的字符更灵活,使用re.split(pattern,str)无论多少个空格或者特殊字符都可以正常切割,也就是去掉:

>>> re.split(r'[\s\,\;]+', 'a,b;; c  d')['a', 'b', 'c', 'd']

这个可以用于标签规范化。

分组

除了简单地判断是否匹配之外,正则表达式还有提取子串的强大功能。用()表示的就是要提取的分组(Group)。比如:

>>> m = re.match(r'^(\d{3})-(\d{3,8})$', '010-12345') #两个分组>>> m<_sre.SRE_Match object at 0x1026fb3e8>>>> m.group(0) #0始终代表原始字符串'010-12345'>>> m.group(1) #依此类推'010'>>> m.group(2)'12345'

然而,用正则表达式无法很好的识别日期,时间却没有问题。

贪婪匹配

贪婪匹配指的是尽可能多的匹配。

>>> re.match(r'^(\d+)(0*)$', '102300').groups()('102300', '') #本是任意个0,却啥都没有了

只要加一个?就可以取消贪婪匹配了:

>>> re.match(r'^(\d+?)(0*)$', '102300').groups()('1023', '00')

编译

当我们在Python中使用正则表达式时,re模块内部会干两件事情:

  • 编译正则表达式,如果正则表达式的字符串本身不合法,会报错;
  • 用编译后的正则表达式去匹配字符串。

为了提高效率,我们可以预编译该正则表达式,接下来重复使用时就不需要编译这个步骤了,直接匹配:

>>> import re# 编译:>>> re_telephone = re.compile(r'^(\d{3})-(\d{3,8})$')# 使用:>>> re_telephone.match('010-12345').groups() #其实就省去了再输一次正则('010', '12345')>>> re_telephone.match('010-8086').groups()('010', '8086')

关于正则表达式还有很多需要讲的内容,通过下面这一张图再配合上面讲的知识,基本可以掌握大多数的用法了。转自http://www.zuidaima.com/share/1935690684959744.htm
Python支持的正则表达式元字符和语法

0 0