re库的使用
re库的使用
精确匹配
如果直接给出字符,就是精确匹配。用\d可以匹配一个数字,\w可以匹配一个字母或数字
s1='00\d'#可以匹配'007',但是匹配不了'00A'
s2='\d\d\d'#可以匹配'010'
s3='\w\w\w'#可以匹配'py3'
s4='\s'#空格
匹配任意字符
s1='py.'#'pyc','pyo','py2'
匹配变长字符
符号 | 功能 |
---|---|
* | 任意个字符,包括0个 |
+ | 至少一个字符 |
? | 0个或者1个字符 |
n个字符 | |
n-m个字符 |
匹配特殊的符号
#010-12345
s='\d{3}\-\d{3,8}'#-是特殊字符要加转义\
表示范围
[]表示范围
字符串 | 表示 |
---|---|
[0-9a-zA-Z_] | 匹配一个数字,字母或者下划线 |
[0-9a-zA-Z_]+ | 至少匹配一个由数字、字母或者下划线所组成的字符串 |
[a-zA-Z_][0-9a-zA-Z_]* | 字母开头,数字或字母或下划线构成的字符串 |
AlB | 匹配A或者B |
^ | 行的开头,^/d必须以数字开头 |
$ | 行的结束,\d$表示以数字结尾 |
Re模块
判断是否匹配
转义的问题
s='ABC\\-001'#python的字符串
#对应的正则表达式字符串变成
#'ABC\-001'
#不考虑转义问题
s=r'ABC\-001'
# 对应的正则表达式字符串不变:
# 'ABC\-001'
判断是否匹配
test = '用户输入的字符串'
if re.match(r'正则表达式', test):
print('ok')
else:
print('failed')
切分字符串
>>>s='a b c'
>>>re.split(r'\s+',s)
>>>['a','b','c']
>>>s='a,b;; c d'
>>>re.split(r'[\s\,\;]+',s)
>>>['a','b','c']
分组
()代表了分组
^(\d{3})-(\d{3,8})$
>>> m = re.match(r'^(\d{3})-(\d{3,8})$', '010-12345')
>>> m
<_sre.SRE_Match object; span=(0, 9), match='010-12345'>
>>> m.group(0)
'010-12345'
>>> m.group(1)
'010'
>>> m.group(2)
'12345'
注意到group(0)永远是原始字符串,group(1)、group(2)……表示第1、2、……个子串。
贪婪匹配
正则匹配默认是贪婪匹配,也就是匹配尽可能多的字符。
>>>re=match(r'^(\d+)(0*)$','102300').groups()
>>>('102300','')
由于\d+采用贪婪匹配,直接把后面的0全部匹配了,结果0*只能匹配空字符串了。
必须让\d+采用非贪婪匹配(也就是尽可能少匹配),才能把后面的0匹配出来。
加个?就可以让\d+采用非贪婪匹配
>>> re.match(r'^(\d+?)(0*)$', '102300').groups()
('1023', '00')