前言:正则表达式是一种用来匹配字符串的强有力的武器。它的设计思想是用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,我们就认为它“匹配”了,否则,该字符串就是不合法的。
re.match函数
re
模块使 Python 语言拥有全部的正则表达式功能。re.match
尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,就返回none,也含着True
和False
的判断。
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