python正则表达式

来源:互联网 发布:淘宝全球购网站 编辑:程序博客网 时间:2024/06/12 14:07

python正则表达式

字符串是编程中涉及到的最多的一种数据结构,对字符串操作的需求无处不在。
正则表达式是一种用来匹配字符串的强有力的武器,它的设计思想是用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,我们就认为它‘匹配’了。

在正则表达式中,如果直接给出字符,就是精确匹配,用\d可以匹配一个数字,\w可以匹配一个字母或数字
. 可以匹配任意字符
*可以匹配任意个字符(包括0个),用+表示至少一个字符,用?表示0个或者1个字符,用{n}表示n个字符,用{n,m}表示n-m个字符
来看一个复杂的例子: \d{3}\s+\d{3,8}
\d{3}匹配3个数字,\s+匹配至少一个空格,\d{3,8}表示3-8个数字。
上面的正则表达式可以匹配‘010 1234567’这种形式的电话号码,但是无法匹配‘010-1234567’,因为中间有特殊字符‘-’,在正则表达式中我们可以用‘\’来转义,上面的电话号码可以通过下面的正则表达式来表示 \d{3}-\d{3,8}

进阶

要做更加精确的匹配,可以用[]来表示范围。比如:
[0-9a-zA-Z\_]可以匹配一个数字,字母或者下划线
[0-9a-zA-Z\_]+可以匹配至少由一个数字,字母或者下划线组成的字符串
[a-zA-Z\_][0-9a-zA-Z\_]*可以匹配由字母或者下划线开头,后接任意个由数字,字母或者下划线组成的字符串,也就是python的合法变量。

A|B可以匹配A或者B,所以[P|p]ython可以匹配‘Python’或者’python’

^表示行的开头, ^\d表示必须以数字开头。

$表示行的结束, \d$表示必须以数字结束

re模块

python提供re模块,包含所有正则表达式的功能,由于python的字符串本身也用\转义,所以要特别注意:
我们强烈建议使用python的r前缀,就不用考虑转义的问题了。
我们来看一个例子
import re
re.match(r’^\d{3}-\d{3-8}$’,’010-12345’)
我们可以看到我们得到的结果是一个match对象,表明匹配成功,如果匹配失败,则返回None
常见的判断方法是:

test='用户输入的字符串'if re.match(r'正则表达式', test):    print 'ok'else:    print 'failed'

切分字符串

用正则表达式切分字符串比用固定的字符更灵活,请看例子

re.split(r'\s+','a b   cde')

得到的结果就是用空格分割的各个字符串
在试试加入,和;

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

分组

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

^(\d{3})-(\d{3,8})$ 分别定义了两个组,可以直接从匹配的字符串中提取出区号和本地号码:
import rere.match(r'^(\d{3})-(\d{3-8})$', '010-12345')print m.group(0)print m.group(1)print m.group(2)

注意到group(0)永远是原始字符串,group(1), group(2)表示第1,2个子串。提取子串非常的有用

贪婪匹配

最后要指出的是,正则匹配默认是贪婪匹配,也就是匹配尽可能多的字符。如何才能让其采用非贪婪匹配呢,加个?就可以啦

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

编译

当我们在python中使用正则表达式的时候,re模块内部会干两件事:
1. 编译正则表达式,如果正则表达式本身不合法,会报错。
2. 用编译后的正则表达式去匹配字符串。
如果一个正则表达式要重复使用几千次,处于效率的考虑,我们可以预编译正则表达式,接下来重复使用的时候就不需要编译这个步骤了,直接匹配:

import re#编译re_telephone = re.compiler(r'^(\d{3})-(\d{3,8})$')#使用re.telephone.match('010-12345').groups()

小结

正则表达式非常强大,要讲清楚的话,可以写一本厚厚的书了,如果你经常遇到正则表达式的问题,你可能需要一本正则表达式的参考书。

0 0
原创粉丝点击