正则表达式中:
①直接给出字符,精确匹配
\d 匹配一个数字
\w 匹配一个字母或数字
.可以匹配任意字符
如: ‘\d\d\d’可匹配 ‘110’
‘\w\w\d’可匹配 ‘py2’
‘\py.’ 可匹配 ‘pyc’ ‘py1’ 等
②匹配变长的字符
* 任意个字符(包括0个)
+ 表示至少一个字符
? 表示0个或1个字符
{n} 表示n个字符
{n,m} 表示n到m个字符
例:
\d{3}\s+\d{3,8}
1、\d{3} 表示匹配三个数字,例如 ‘110’
2、\s 可以匹配一个空格(也包括Tab等空白符),\s+ 表示至少有一个空格,例如匹配 ’ ‘,’ ’
3、\d{3,8} 表示3到8个数字 例如 ‘1234567’
进阶
要做更精确的匹配,可用[] 表示范围:
· [0-9a-zA-Z_] 可以匹配一个数字、字母或者下划线;
· [0-9a-zA-Z_]+ 可以匹配至少由一个数字,字母或者下划线组成的字符串,比如 ‘a000’,’py_’等
· [a-zA-Z_][0-9a-zA-Z_]* 可以匹配字母或下划线开头,后接任意个由一个数字、字母或者下划线组成的字符串,也就是python的合法变量
· [a-zA-Z_][0-9a-zA-Z_]{0,19} 更精确的限制了变量长度是1-20个字符(前面1个字符+后面最多19个字符)
A|B 可以匹配A或B,所以(P|p)ython可以匹配’Python’ 或 ‘python’
^ 表示行的开头 ^\d 表示必须以数字开头
$ 表示行的结束 放在最末尾表示必须以……..结束
注意:类似 ‘py’ 可以匹配‘python’但加上 ^py$ 就变成了整行匹配,就只能匹配’py’了
\A 与^在默认情况下意义相同,表示输入字符串的开始位置
\B 与$ 在默认情况下意义相同,表示输入字符串的结束位置
re模块
使用正则表达式,首先导入python提供的re模块
impot re
判断匹配时,使用Python的 r 前缀
s=r'123\_aaa'
用match方法判断是否匹配成功,成功则返回一个match对象,否则返回None,常见的判断方法是:
test='输入的字符串'
if re.match(r'正则表达式',test):
print 'ok'
else:
print 'failed'
切分字符串
使用 split()函数,语法:split(r’正则表达式’,’字符串’)
正则表达式中是切分字符串的分段点,函数返回一个list
import re
print re.split(r'[\s\,]+','a,b, ,c, , d')
['a', 'b', 'c', 'd']
分组
使用 group()函数分组,即是提取子串。用() 表示要提取的分组
test='010-1234567'
if re.match(r'\d{3}\-\d{3,8}$',test):
print 'ok'
else:
print 'no'
m=re.match(r'^(\d{3})\-(\d{3,8})',test)
print m.group(0)
print m.group(1)
print m.group(2)
注意:group(0) 永远是原始字符串,group(1)、group(2)….分别表示按括号顺序表示的子串。
贪婪匹配
正则表达式默认是贪婪匹配,也就是匹配尽可能多的字符。
例如:
print re.match(r'^(\d+)(0*)$','10023000').groups()
('10023000', '')
可见\d+采用贪婪匹配,直接把后面的0全部匹配了,结果0*只能匹配空字符串
让\d+采用非贪婪匹配,才能把后面的0匹配出来,在其后加?可让\d+采非贪婪匹配
print re.match(r'^(\d+?)(0*)$','10023000').groups()
('10023', '000')
编译
如果需要重复的使用某个正则表达式,那么你可以先将该正则表达式编译成模式对象。
我们使用re.compile()方法编译。
以下为编译标志: