- 如果给出具体字符,就是精确匹配。
\d 表示一个数字
\w 表示一个数字或字母
\s 表示一个空格
\b 表示单词的开始或结束
\A 匹配字符串的开始
\Z 匹配字符串的结束 - . 匹配任意字符
- * 表示任意个字符(包含0个)
- + 表示至少1个字符
- ?表示0个或1个字符
- {n}表示n个字符
- {n, m}表示n到m个字符
- []表示范围,比如[0-9a-zA-Z_]表示1个数字或者字母或者下划线
- A|B匹配A或B
- ^ 表示行的开头,$ 表示行的结束
Python内置了re模块。
match()方法:字符串匹配表达式
import re
# match方法匹配成功,返回一个Match对象,否则返回None
if re.match(r'^\d{3}\s*-\s*\d{8}$', '021 - 22815487'):
print('ok')
else:
print('fail')
split()方法:切分字符串,用正则表达式适用范围更广
s = 'a, b ; c'
# 两者的差距,字符串split不能过滤;等
print(s.split(' '))
print(re.split(r'[\s\,\;]+', s))
分组,用()表示的就是要提取的分组
match = re.match(r'^(\d{3})-(\d{8})$', '021-55218547')
# group(0)永远是原始的字符串
print(match.group(0))
print(match.group(1))
print(match.group(2))
# 匹配时间
re_match = re.match(r'^([0|1]\d|2[0-3]):([0-5]\d):([0-5]\d)$', '00:00:00')
print(re_match.group(0))
# groups不包含原始字符串
print(re_match.groups())
正则匹配默认贪婪匹配,下面\d+匹配了所有,所以0*只能匹配空字符串了
print(re.match(r'^(\d+)(0*)$', '1002300').groups())
在\d+后面加上?,就是非贪婪匹配了,0*能匹配到00
print(re.match(r'^(\d+?)(0*)$', '1002300').groups())
编译
当使用正则表达式时,re模块内部会干两件事情:
- 编译正则表达式,如果表达式不合法,会报错
- 用编译后的表达式去匹配字符串
如果一个正则表达式要反复用到,可以预编译表达式:
re_compile = re.compile(r'^(\w+|\w+.\w+)@(\w+.com)$')
print(re_compile.match('370996@qq.com').groups())
print(re_compile.match('sd%fgsg233_sa@163.com').groups())
网友评论