一、基础匹配
1、什么是正则表达式
正则表达式:又称规则表达式(Regular Expression),是使用单个字符串来描述、匹配某个句法规则的字符串,常被用来检索、替换那些符合某个模式(规则)的文本。
简单来说,正则表达式就是使用字符串定义规则,并通过规则去验证字符串是否匹配。
比如,验证一个字符串是否是符合条件的电子邮箱地址,只需要配置好正则规则,即可匹配任意邮箱。比如通过正则规则:()即可匹配一个字符串是否是标准邮箱格式,但如果不使用正则,使用if else来对字符串做判断就非常困难了。
2、正则的三个基础方法
Python正则表达式使用re模块,并基于re模块中的三个基础方法来做正则匹配。分别是:match、search、findall三个基础方法。
- re.match(匹配规则,被匹配字符串)
从被匹配字符串开头进行匹配,匹配成功返回匹配对象(包含匹配的信息),匹配不成功返回空。
import re
s = 'python itheima python itheima python itheima'
result = re.match('python', s)
print(result) # <re.Match object; span=(0, 6), match='python'>
print(result.span()) # (0, 6) 匹配成功,所在字符串下标0-6(不含)
print(result.group()) # python 匹配成功,匹配到的字符串是python
s = '1python itheima python itheima python itheima'
result = re.match('python', s)
print(result) # None(匹配失败)
- search(匹配规则,被匹配的字符串)
搜索整个字符串,找出匹配的。从前向后,找到第一个后,就停止,不会继续向后,整个字符串都找不到,返回None
s = '1python itheima python itheima python itheima'
result = re.match('python', s)
print(result) # None(匹配失败)
s = '1python666itheima666python666'
result = re.search('python', s)
print(result) # <re.Match object; span=(1, 7), match='python'>
print(result.span()) # (1, 7) 匹配成功,所在字符串下标1-7(不含)
print(result.group()) # python 匹配成功,匹配到的字符串是python
# 整个字符串都找不到,返回None
s = 'itheima666'
result = re.search('python', s)
print(result) # None
- findall(匹配规则,被匹配字符串)
匹配整个字符串,找出全部匹配项,找不到返回空list:[]
s = '1python666itheima666python666'
result = re.findall('python', s)
print(result) # ['python', 'python']
result = re.findall('itcast', s)
print(result) # []
3、总结
二、元字符匹配
在刚刚我们只是进行了基础的字符串匹配,正则最强大的功能在于元字符匹配规则。
1、单字符串匹配
import re
# 找出全部数字
s = "黑马itheima @@python2 !!666 ##itcast3"
result = re.findall(r'\d', s) # 字符串前面带上r的标记,表示字符串中转义字符无效,就是普通字符的意思
print(result) # ['2', '6', '6', '6', '3']
# 找出特殊字符
result = re.findall(r'\W', s)
print(result) # [' ', '@', '@', ' ', '!', '!', ' ', '#', '#']
# 找出全部英文字母
result = re.findall(r'[a-zA-Z]', s)
print(result) # ['i', 't', 'h', 'e', 'i', 'm', 'a', 'p', 'y', 't', 'h', 'o', 'n', 'i', 't', 'c', 'a', 's', 't']
注意:字符串的r标记表示,字符串内转移字符无效,作为普通字符使用。
2、数量匹配
3、边界匹配
4、分组匹配
5、案例
# 匹配账号
r = r'^[0-9a-zA-Z]{6,10}$'
s = "012345678"
print(re.findall(r, s)) # ['012345678']
# 匹配QQ号
r = r'^[1-9][0-9]{4,10}$'
s = "1123456"
print(re.findall(r, s)) # ['1123456']
# 匹配邮箱地址
# {内容}.{}.{}@{内容}.{内容}
r = r'(^[\w-]+(\.[\w-]+)*@(qq|163|gmail)(\.[\w-]+)+$)'
s = "abc.bcd.efg@qq.com.cn"
print(re.findall(r, s)) # [('abc.bcd.efg@qq.com.cn', '.efg', 'qq', '.cn')] ()分组匹配,将括号中字符作为一个分组
print(re.match(r, s)) # <re.Match object; span=(0, 21), match='abc.bcd.efg@qq.com.cn'> 不想匹配其他()的组,可以用match
s = "abc.bcd@126.com"
print(re.match(r, s)) # None
参考:黑马程序员Python教程,Python从入门到精通(2022版)