一、准备知识 \d:匹配一个数字 \w:匹配一个字母 . :匹配任意字符 \s :匹配一个空格

?表示0个或1个字符 +表示至少一个字符 *表示任意个字符(包括0个) {n}表示n个字符,{n,m}表示n-m个字符

[0-9a-zA-Z_]可以匹配一个数字、字母或者下划线 (P|p)ython可以匹配'Python'或者'python' ^py$只能匹配'py'了

二、在Python中使用 (1)匹配

import re re.match(r'^\d{3}-\d{3,8}$', '010-12345') <_sre.SRE_Match object at 0x1026e18b8>

re.match(r'^\d{3}-\d{3,8}$', '010 12345')

match()方法判断是否匹配,如果匹配成功,返回一个Match对象,否则返回None

(2)切分字符串

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

(3)提取子串

import re m = re.match(r'^(\d{3})-(\d{3,8})$', '010-12345') m.group(0) '010-12345'

m.groups() ('010', '12345')

m.group(1) '010'

m.group(2) '12345' 用()表示的就是要提取的分组(Group),group(0)永远是原始字符串,group(1)、group(2)……表示第1、2、……个子串

(4)贪婪匹配 正则匹配默认是贪婪匹配,也就是匹配尽可能多的字符。举例如下,匹配出数字后面的0:

re.match(r'^(\d+)(0*)$', '102300').groups() ('102300', '') 由于\d+采用贪婪匹配,直接把后面的0全部匹配了,结果0*只能匹配空字符串了。

必须让\d+采用非贪婪匹配(也就是尽可能少匹配),才能把后面的0匹配出来,加个?就可以让\d+采用非贪婪匹配:

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

(5)编译 先编译-后匹配,提高效率

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')

三、实例 #邮箱匹配 import re

re_email = re.compile(r'^[0-9a-zA-Z][0-9a-zA-Z_.]+@[0-9a-z]+.(com|cn|org|net)$')

m = re_email.match(email)

if m: print "OK." else: print "You have input a wrong e-mail."