您的位置:首页 > 编程语言 > Python开发

python中的正则表达式

2015-08-25 20:50 495 查看
一、前奏:

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才对),我觉得正则表达式其实就是一个检查的作用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: