十二:正则表达式:
我们判断一个字符串是否是合法的Email的方法是:1 创建一个匹配的Email正则表达式 2:用改正则表达式去匹配用户的输入来判断是否合法。
\d表示可以匹配一个数字
\w表示可以匹配一个字母或者数字
. 可以匹配任意字符
*表示任意个字符
+表示一个或者多个字符
?表示0个或者一个字符
{n}表示n个字符
{n,m} 表示n~m个字符
要做更精确的匹配 可以用[]表示范围
[0-9a-zA-Z\_] 表示可以匹配一个数字 字母或者下划线
A|B 表示匹配A或者B
^表示行的开头 ^\d表示必须以数字开头
$表示行的结束 \d$表示必须以数字结尾
python 提供re模块 包含了所有的正则表达式的功能
>>>import re>>>re.match(r'^\d{3}\-\d{3,8}$','010-12345')<_sre.SRE_Match object at 0x23984242>>>>re.match(r'^\d{3}\-\d{3,8}','010 12345')>>>
match 方法判断是否匹配成功 如果匹配成功 返回一个match对象 否则返回None 常见的判断方法就是:
test='用户输入的数据'if re.match(r'正则表达式',test):print 'ok'else:print 'failed'
用正则表达式切分字符串 比用固定的字符 更加的灵活 正常一般如下:
>>>'a b c'.split(' ')
['a','b','','','c']
无法识别连续的空格 二用正则表达式:
>>>re.split(r'\s+','a b c')
['a','b','c']
无论多少个空格都可以正常分割
除了简单的判断是否匹配外 正则表达式还有提取子串的强大功能 用()表示的就是要提取的分组
^(\d{3})-(\d{3,8})$分别定义了两个组 ,可以直接从匹配的字符串中提取出区号和本地号
>>>m=re.match(r'
^(\d{3})-(\d{3,8})$
','010-12345')
>>>m
<_sre.SRE_Match object at 0x12312414>
>>>m.group(1)
'010'
>>>m.group(2)
>>>'12345'
如果正则表达式中定义了组 就可以在Match对象上用group()方法提取出子串来 注意的是 group(0)永远是元是字符串 group(1) group(2) 表示第1,2,。。个子串
贪婪匹配: 正则表达式默认的是贪婪匹配 也就是匹配的尽可也能多的字符 比如想要匹配出数字后面的0
>>>re.match(r'^(\d+)(0*)$','102300').groups()
('102300','')
由于\d+采用的是贪婪匹配 所以数字后面的0都被匹配上了 结果0*就只能匹配空字符串了 必须让、\d+采用非贪婪匹配就需要使用? 也就是 \d+?
>>>re.match(r'^(\d+?)(0*)$','102300').groups()
('1023','00')
当我们在Python中使用正则表达式的时候 re模块内部会干两件事情:
1:编译正则表达式 如果正则表达式的字符串本身不合法就会报错
2:用编译后的正则表达式去匹配字符串
如果一个正则表达式重复使用几千次 我们可以预编译改正则表达式 接下来重复使用的时候就不需要编译这个步骤了
>>>import re
#编译
>>>re_telephone=re.compile(r'^(\d{3})-(\d{3,8})$')
#使用
>>>re_telephone.match('010-12345').groups()
('010','12345')