Python学习从0到1 day29 Python 高阶技巧 ⑦ 正则表达式
目录
一、正则表达式
二、正则表达式的三个基础方法
1.match 从头匹配
2.search(匹配规则,被匹配字符串)
3.findall(匹配规则,被匹配字符串)
三、元字符匹配
单字符匹配:
注:
示例:
找出特殊字符
找出全部的英文字母
找出单词字符
数量匹配:
边界匹配
分组匹配
案例
注:
我们终将上岸,阳光万里
—— 24.11.15
一、正则表达式
正则表达式,又称规则表达式(Regular Expression),是使用单个字符串来描述、匹配某个句法规则的字符串,常被用来检索、替换那些符合某个模式(规则)的文本。
简单来说,正则表达式就是使用:字符串定义规则,并通过规则去验证字符串是否匹配
比如,验证一个字符串是否是符合条件的电子邮箱地址,只需要配置好正则规则,即可匹配任意邮箱。比如通过正则规则:(^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$),即可匹配一个字符串是否是标准邮箱格式
但如果不使用正则,使用if else来对字符串做判断就非常困难了:
二、正则表达式的三个基础方法
Python正则表达式,使用re模块,并基于re模块中三个基础方法来做正则匹配。
分别是:match、search、findall三个基础方法
re.match(匹配规则,被匹配字符,串)
从被匹配字符串开头进行匹配,匹配成功返回匹配对象(包含匹配的信息),匹配不成功返回空
1.match 从头匹配
import re
s = "一切都会好的"
# match 从头匹配
res1 = re.match("一切", s)
print(res1)
2.search(匹配规则,被匹配字符串)
搜索整个字符串,找出匹配的。从前向后,找到第一个后,就停止,不会继续向后
import re
s = "一切都会好的"
# search 从头到尾进行搜索
res2 = re.search("都会好", s)
print(res2)
3.findall(匹配规则,被匹配字符串)
匹配整个字符串,找出全部匹配项
找不到返回空list:[]
import re
# findall 找出全部匹配项
s = "一切都会好的,我一直相信"
res3 = re.findall("一", s)
print(res3)
三、元字符匹配
在刚刚我们只是进行了基础的字符串匹配,正则最强大的功能在于元字符匹配规则。
单字符匹配:
注:
字符串前面带上r的标记,表示字符串中转义字符无效,就是普通字符的意思
示例:
字符串 s = "一切都会好的_021104_我一直相信_YYSHlcl"
找出特殊字符
import re
s = "一切都会好的_@021104_我一直相信_@YYSHlcl"
res1 = re.findall("\W",s)
print(res1)
找出全部的英文字母
import re
s = "一切都会好的_@021104_我一直相信_@YYSHlcl"
# 字符串前面带上r的标记,表示字符串中转义字符无效,就是普通字符的意思
# 找出所有英文字符
res2 = re.findall(r"[a-zA-Z]",s)
print(res2)
找出单词字符
import re
s = "一切都会好的_@021104_我一直相信_@YYSHlcl"
# 字符串前面带上r的标记,表示字符串中转义字符无效,就是普通字符的意思
# 找出所有的单词字符
res3 = re.findall(r"\w",s)
print(res3)
数量匹配:
边界匹配
分组匹配
案例
匹配账号,只能由字母和数字组成,长度限制6到10位
规则为:^[0-9a-zA-Z]{6,10}$
匹配QQ号,要求纯数字,长度5-11,第一位不为0
规则为:^[1-9][0-9]{4,10}&
[1-9]匹配第一位,[0-9]匹配后面4到10位
匹配邮箱地址,只允许qq、163、gmail这三种邮箱地址
规则为:^[\w-]+(\.[\w-]+)*@(qq|163|gmail)(\.[\w-]+)+&
注:
字符串的 r 标记表示,字符串内转义字符无效,作为普通字符使用
import re
# 匹配账号,只能由字母和数字组成,长度限制6到10位
# 规则为:^[0-9a-zA-Z]{6,10}$
res1 = re.findall(r"^[0-9a-zA-Z]{6,10}$","954926928lcl")
print("res1:", res1)
res2 = re.findall(r"^[0-9a-zA-Z]{6,10}$","954926928")
print("res2:", res2)
# 匹配00号,要求纯数字,长度5-11,第一位不为0
# 规则为:^[1-9][0-9]{4,10}&
# [1-9]匹配第一位,[0-9]匹配后面4到10位
res3 = re.findall(r"^[1-9][0-9]{4,10}$","2952234004")
print("res3:", res3)
# 匹配邮箱地址,只允许qq、163、gmail这三种邮箱地址
# 规则为:^[\w-]+(\.[\w-]+)*@(qq|163|gmail)(\.[\w-]+)+&
res4 = re.findall(r"(^[\w-]+(\.[\w-]+)*@(qq|163|gmail)(\.[\w-]+)+$)","lcl@163.com")
print("res4:", res4)
res5 = re.findall(r"(^[\w-]+(\.[\w-]+)*@(qq|163|gmail)(\.[\w-]+)+$)","2952234004@qq.com")
print("res5:", res5)
res6 = re.findall(r"(^[\w-]+(\.[\w-]+)*@(qq|163|gmail)(\.[\w-]+)+$)","1144099341@gmail.com")
print("res6:", res6)
# 正则表达式中若有括号分组,则需要在正则表达式中加括号使正则表达式整体变为一个组
# match方法可以只输出完整的组
res7 = re.match(r"(^[\w-]+(\.[\w-]+)*@(qq|163|gmail)(\.[\w-]+)+$)","1144099341@gmail.com")
print("res7:",res7)