python正则表达式用法超详细讲解大全
作者:YZL40514131 发布时间:2023-09-13 03:27:07
一、re.compile 函数
作用:compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。
案例:如何判断是正规的手机号
phone='''
weref234
16888888888
as13423423
weq
435435
15812312312e
afa15812312316
13111111111
'''
pattern=re.compile(r'1[3-9]\d{9}') #todo 编译正则表达式之后得到一个编译对象
result=pattern.search(phone) #todo search只会返回第一个匹配的结果,如果没有匹配成功返回None
print(result) #todo <re.Match object; span=(10, 21), match='15812312312'>
打印结果:
<re.Match object; span=(10, 21), match=‘16888888888’>
16888888888
(10, 21)
🔥🔥🔥特别注意1
result=pattern.search(phone):search匹配成功返回的是Match对象;search只会返回第一个匹配的结果,如果没有匹配成功则返回None
result.group():返回第一个匹配结果
result.span():返回第一个匹配结果的下标,为什么是(10,21)呐?
weref234:从0开始,4结束后还包含了换行符’/n’2个字符,所以从10开始,不包含21,前闭后开的原则
🔥🔥🔥特别注意2
match函数:match匹配成功返回的是Match对象;作用用来匹配第一个注意是第一个字符的,这里的第一个是在被搜索的这串字符的第一个索引上的;如果第一个字符不匹配,则返回None
phone='''
weref234
16888888888
as13423423
weq
435435
15812312312e
afa15812312316
13111111111
'''
pattern=re.compile(r'1[3-9]\d{9}') #todo 编译正则表达式之后得到一个编译对象
result2=pattern.match(phone)
print(result2)
打印结果为None,因为第一个字符为w开头,所以匹配不到
phone1="17812312345aaa"
pattern=re.compile(r'1[3-9]\d{9}') #todo 编译正则表达式之后得到一个编译对象
result2=pattern.match(phone1) #todo match函数是从第一个字符开始匹配(从w开始匹配),如果第一个字符不匹配,则返回None
print(result2)
print(result2.group()) #todo 返回第一个匹配结果
print(result2.span()) #todo 返回第一个匹配结果的下标
打印结果:
<re.Match object; span=(0, 11), match=‘17812312345’>
17812312345
(0, 11)
二、正则表达式
表示字符
.:匹配任意单个字符(不包括换行符)
[]:匹配字符集,区间中的集合,可匹配其中任意一个字符
\d:匹配数字,即0-9,可以表示为[0-9]、
\s:匹配空白字符,即空格
\S:匹配非空白字符,
\w:匹配单词字符,即a-z、A-Z、0-9、_
\W:匹配非单词字符
import re
#.匹配任意单个字符(不包括换行符)
one='123a'
res=re.match('.',one)
print(res.group())
#[]:匹配字符集,区间中的集合,可匹配其中任意一个字符
two='8'
res1=re.match('[0-9]',two) #匹配1-9之间的数字
print(res1.group())
res2=re.match('[0,1,8,9]',two) #匹配0、1、8、9之间的数字
print(res2.group())
two_2='Hello Python'
print(re.match('[hH]',two_2).group()) #匹配小写或大写H
#\d:匹配数字,即0-9,可以表示为[0-9]
three='天空1号发射成功'
print(re.match('天空\d',three).group())
print(re.search('\d',three).group())
表示数字
*:匹配前一个字符出现0次或者无限次,即可有可无
+:匹配前一个字符出现1次或者无限次,即至少有1次
?:匹配前一个字符出现1次或者0次,即要么有1次,要么没有
{m}:匹配前一个字符出现m次
{m,}:匹配前一个字符至少出现m次
{m,n}:匹配前一个字符出现从m到n次
需求1:匹配一个字符串第一个字母是大写,后面的字母必须是小写或者没有
print(re.match('[A-Z][a-z]*','Mn').group())
print(re.match('[A-Z][a-z]*','Msdfsg').group())
print(re.match('[A-Z][a-z][a-z]','Msdfs').group())
Mn
Msdfsg
Msd
需求2 匹配一个变量名,
print(re.match(r'[a-zA-Z_]+[\w]*','name1').group())
print(re.match(r'[a-zA-Z_]+[\w]*','_name1').group())
print(re.match(r'[a-zA-Z_]+[\w]*','2_name1'))
name1
_name1
None
需求3:匹配0-99之间的任意一个数字
print(re.match('[0-9]?[0-9]','88').group())
print(re.match('[0-9]?[0-9]','8').group())
print(re.match('[0-9]?[0-9]','08').group())
print(re.match('[0-9]?[0-9]','888').group())
88
8
08
88
需求4:匹配密码(8-20位,可以是大小写的字母、数字、下划线)
print(re.match('[a-zA-Z0-9_]{8,20}','12345678').group())
print(re.match('[a-zA-Z0-9_]{8}','12345678').group())
12345678
12345678
匹配边界
^:表示以什么开头
$:表示以什么结尾
\b:表示匹配单词的边界
|:或者
需求5:匹配163的邮箱地址,邮箱的用户名包含6~18个字符,可以是数字、字母、下划线、但是必须以字母开头,.com结尾
emails='''
awhaldc@163.com
asdasdfddasdfascvdfgbdfgdsds@163.com
afa_@163.com
awhaldc666@163.comax
q112dsdasdas@163.com
aaaa_____@qq.com
aaaa____@qq.com
'''
print(re.search('^[a-zA-Z][\w]{5,17}@163\.com$',emails,re.MULTILINE).group())
q112dsdasdas@163.com
需求6:匹配单词的边界
print(re.search(r'.*\bbeijing\b','I Love beijing too'))
print(re.search(r'.*\bbeijing\b','I Love beijing1 too'))
print(re.search(r'.*beijing','I Love beijing too'))
I Love beijing
None
I Love beijing
三、re模块的高级用法
re.findall(pattern,string)
1、findall:pattern在string里所有的非重复匹配,返回一个迭代器iterator保存了匹配对象
需求7:匹配所有符合以下条件的邮箱
163的邮箱地址,
邮箱的用户名包含6~18个字符,
可以是数字、字母、下划线、
但是必须以字母开头,
.com结尾
import re
emails='''
awhaldc@163.com
asdasdfddasdfascvdfgbdfgdsds@163.com
afa_@163.com
112dsdasdas@163.com
aaaa_____@126.com
aaaa____@163.com
'''
#findall:pattern在string里所有的非重复匹配,返回一个迭代器iterator保存了匹配对象
list=re.findall(r'(^[a-zA-Z][\w]{5,17}@(163|126).com$)',emails,re.MULTILINE)
print(list)
for email in list:
print(email[0])
[(‘awhaldc@163.com’, ‘163’), (‘aaaa_____@126.com’, ‘126’), (‘aaaa____@163.com’, ‘163’)]
awhaldc@163.com
aaaa_____@126.com
aaaa____@163.com
2、sub:将匹配到的字符串,再次进行操作
需求8:匹配一个数字,把匹配的数字进行家1,返回
def add(result): #result是一个匹配对象
str_num=result.group()
num=int(str_num)+1
return str(num)
print(re.sub(r'\d+',add,'a=111'))
a=112
3、split:切割匹配成功的字符串
line='hello,world,china.'
print(re.split(r'\W+',line))
[‘hello’, ‘world’, ‘china’, ‘’]
需求9:以冒号或者空格,切割字符串
print(re.split(r':| ','info:kobe 18 beijing'))
[‘info’, ‘kobe’, ‘18’, ‘beijing’]
四、贪婪和非贪婪模式
什么是贪婪模式?
python里数量词默认是贪婪的,总是尝试匹配尽可能多的字符
什么是非贪婪模式?
与贪婪模式相反,总是尝试匹配尽可能少的字符,可以使用、?、+、{m,n}加上?,使贪婪模式变为非贪婪模式*
需求9:非贪婪模式,需求:把电话和电话的描述信息尽可能的分开,只能用正则表达式
line2='this is my phone:188-1111-6666'
#非贪婪模式,需求:把电话和电话的描述信息尽可能的分开,只能用正则表达式
result=re.match(r'(.+?)(\d+-\d+-\d+)',line2)
print(result.group(1))
print(result.group(2))
this is my phone:
188-1111-6666
来源:https://blog.csdn.net/YZL40514131/article/details/127150270
猜你喜欢
- 写一个python脚本,实现简单的http服务器功能:1.浏览器中输入网站地址:172.20.52.163:200142.server接到浏
- 本文实例讲述了Django返回json数据用法。分享给大家供大家参考,具体如下:1、前端。jQuery发送GET请求,并解析json数据。g
- 我们知道两个 set 对象之间,可以取交集、并集、差集、对称差集,举个例子:s1 = {1, 2,
- 字体设计是人类商业活动的需求,它随着时代和科学技术的进步而不断地变化着。被广泛应用于网络生活的各个方面。现代字体设计在计算机技术的应用中已经
- 用Pdb调试有多种方式使用 Pdb调试 Python的程序的方式主要是下面的三种!下面逐一介绍命令行加-m参数命令行启动目标程序,加上-m参
- 前言本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。PS:如有需要Python学习资料的
- 本文实例讲述了javascript实现简单的可随机变色网页计算器。分享给大家供大家参考,具体如下:该程序能实现简单的加、减、乘、除、求余,页
- 前言:作为测试工程师都知道,json格式的文件使我们常用的一种数据存放形式,那么对于python文件的处理,python语言有着得天独厚的条
- 如何让用户也能修改密码? 好了,照下面添加到你要添加的地方去:<%id = Request(&qu
- 框架概念框架和web服务器关系·静态资源:不是经常变化的资源、往往是固定不变的资源·动态资源:经常变化的资源·模板文件:提供了一个显示的模板
- 题记:django如果要并和原有的数据库,那么就需要把现有数据库的表写入model.py中。一,在setting.py中配置好连接数据库的参
- -- SQL Server 2000 SELECT a.name AS 字段名, CASE WHEN EXISTS (SELECT 1 FR
- 前言本文主要介绍了关于Python中TCP socket的写法,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。一、 服务器
- 这篇文章主要介绍了python requests抓取one推送文字和图片代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一
- vue后台返回base64图片无法显示关于后台接口返回的图片base64格式页面无法显示的问题,我遇到的原因是因为返回的一串内容里面存在空格
- 装饰器简介:装饰器(decorator)是一种高级Python语法。装饰器可以对一个函数、方法或者类进行加工。在Python中,我们有多种方
- 点击按钮,出现半透明遮罩层弹框,说说自己之前发过的愁吧1、遮罩层半透明了 弹框也跟着半透明了 就像这样 绝望吧 是哪里错了呢?你的
- 不加的话貌似只在ie6出现过问题。出现过:改变图片地址,结果图片不见了,加载样式,但样式文件没了。就像是中断了资源的下载一样,正确时解释是
- 无限分类是实际开发中经常用到的一种数据结构,一般我们称之为树形结构。题设:类似淘宝的商品分类,可以在任意分类设置其子类。 一、创建
- 前言:最近在学习PYQT5,感觉还挺有趣的,顺便记录一下自己的打包记录,也就当学习笔记啦,如果刚好也在学习python打包的小伙伴可以学一学