【Python】正则表达式

正则表达式,又称规则表达式(Regular Expression),是使用单个字符串来描述、匹配某个句法规则的字符串,常被用来检索、替换那些符合某个模式(规则)的文本。

简单来说,正则表达式就是使用:字符串定义规则,并通过规则去验证字符串是否匹配

比如,验证一个字符串是否是符合条件的电子邮箱地址,只需要配置好正则规则,即可匹配任意邮箱。通过正则规则:(^[\W-]+(\.[\W-]+)*@[\W-]+(\.[\W-]+)+$)即可匹配一个字符串是否是标准邮箱格式

如果不使用正则,使用if else来对字符串做判断就非常困难了

Python正则表达式,使用re模块,并基于re模块中三个基础方法来做正则匹配

分别是:match、search、findall

基础方法

re.match(匹配规则,被匹配字符串)

从被匹配字符串开头进行匹配,匹配成功返回匹配对象(包含匹配的信息),匹配不成功返回空

import re
s = "root was the root cause of the problem"
result = re.match("root",s)
print(result)
print(result.span())
print(result.group())
s1 = "Would you like to eat a root?"
result1 = re.match("root",s1)
print(result1)

运行结果:

<re.Match object; span=(0, 4), match='root'>
(0, 4)
root
None

从开头开始匹配,开头不匹配后面也不匹配,返回None

那我们要想知道字符串里包不包含某个字符串呢?

re.search(匹配规则,被匹配字符串)

搜索整个字符串,找出匹配的。从前向后,找到第一个后,就停止,不会继续向后;找不到返回None

import re
s1 = "Would you like to eat a root?"
result1 = re.search("root",s1)
print(result1)
s2 = "where are you?"
result2 = re.search("root",s2)
print(result2)

运行结果:

<re.Match object; span=(24, 28), match='root'>
None

那我们要想找到所有字符串呢?

findall(匹配规则,被匹配字符串)

匹配整个字符串,找出全部匹配项;找不到返回空list

import re
s1 = "root was the root cause of the problem"
result1 = re.findall("root",s1)
print(result1)
s2 = "where are you?"
result2 = re.findall("root",s2)
print(result2)

运行结果:

['root', 'root']
[]

元字符匹配

在刚刚我们只是进行了基础的字符串匹配,正则最强大的功能在于元字符匹配规则

单字符匹配

示例:

import re
s = "1ytj7&%#2btSRT*(9xxx"
result1 = re.findall(r'\d',s)
result2 = re.findall(r'\W',s)
result3 = re.findall(r'[a-zA-Z]',s)
result4 = re.findall(r'[123abc]',s)
print(result1)
print(result2)
print(result3)
print(result4)

运行结果:

['1', '7', '2', '9']
['&', '%', '#', '*', '(']
['y', 't', 'j', 'b', 't', 'S', 'R', 'T', 'x', 'x', 'x']
['1', '2', 'b']

数量匹配

边界匹配&分组匹配

示例:

import re
# 匹配账号,只能由字母和数字组成,长度限制6到10位
r1 = "^[0-9a-zA-Z]{6,10}$"
s1 = "root1729"
s2 = "translation777"
s3 = "123_45@"
print(re.findall(r1,s1))
print(re.findall(r1,s2))
print(re.findall(r1,s3))
print("分割线----------")
# 匹配QQ号,要求纯数字,长度5-11位,第一位不为0
r2 = "^[1-9][0-9]{4,10}$"
s4 = "123456"
s5 = "060600"
s6 = "1a2b3c"
print(re.findall(r2,s4))
print(re.findall(r2,s5))
print(re.findall(r2,s6))
print("分割线----------")
# 匹配邮箱地址,只允许qq、163、gmail这三种邮箱地址
r3 = r'(^[\w-]+(\.[\w-]+)*@(qq|163|gmail)(\.[\w-]+)+$)'
s7 = "user.root.select@163.com.cn"
s8 = "worldwide@csgo.com"
print(re.match(r3,s7))
print(re.match(r3,s8))

运行结果:

['root1729']
[]
[]
分割线----------
['123456']
[]
[]
分割线----------
<re.Match object; span=(0, 27), match='user.root.select@163.com.cn'>
None
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值