python学习笔记
今日内容概要
- 正则表达式
今日内容详细
正则表达式
正则表达式线上测试网址: http://tool.chinaz.com/regex/
官方定义:正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的
一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字
符串”用来表达对字符串的一种过滤逻辑。
ps:该知识点不属于任何一门编程语言,是一个独立的学科
主要用于数据的查找与筛选
1.前戏
需求:编写代码校验用户输入的手机号是否合法(常见 13 15 17 18 19)
纯python代码逻辑实现:
# 1.获取用户输入的手机号
phone_num = input('请输入您的手机号>>>:').strip()
# 2.判断用户输入的手机号是否是纯数字
if phone_num.isdigit():
# 3.判断总长度是否是11位
if len(phone_num) == 11:
# 4.判断是否以常见的电话号码开头 13 15 17 18 19
if phone_num.startswith('13') or phone_num.startswith('15') or phone_num.startswith(
'17') or phone_num.startswith('18') or phone_num.startswith('19'):
print('手机号合法')
print(int(phone_num))
else:
print('手机号开头不对')
else:
print('手机号必须是11位')
else:
print('手机号必须是纯数字')
正则表达式实现:
import re
phone_num = input('把你的手机号告诉我>>>:').strip()
if re.match('^[13|15|17|18|19][0-9]{9}',phone_num):
print(phone_num)
else:
print('输入不合法')
总结:
正则表达式本质上就是使用一些符号的组合产生一些特殊的含义,然后去字符串中筛选出符合条件的数据
正则表达式之字符组
'''字符组在没有量词修饰的情况下一次只会针对一个数据值'''
[0-9] 匹配0到9之间的任意一个数字(包括0和9)
全称是:[0123456789]
[A-Z] 匹配A到Z之间的任意一个大写字母(包括A和Z)
全称是:[ABCD...WXYZ]
[a-z] 匹配a到z之间的任意一个小写字母(包括a和z)
全称是:[abcd...wxyz]
[0-9a-zA-Z] 数字,小写字母,大写字母都可以
注意: 在括号内编写的多个数据值彼此都是或的关系
正则表达式之特殊符号
特殊符号在没有量词修饰的情况下一个符号一次只会针对一个数据值
符号 | 匹配内容 |
---|---|
. | 匹配除换行符以外的任意字符 |
\w | 匹配字母或数字或下划线 |
\W | 匹配非字母或数字或下划线 |
\d | 匹配数字 |
^ | 匹配字符串的开头 |
$ | 匹配字符串的结尾 |
a|b | 匹配字符a或字符b |
() | 给正则表达式分组,不影响正则表达式的匹配 |
[] | 匹配字符组中的字符 |
[^] | 匹配除了字符组中字符的所有字符 |
\s | 匹配任意的的空白符 |
\n | 匹配换行符 |
\t | 匹配制表符 |
\b | 匹配一个单词的结尾 |
\D | 匹配非数字 |
\S | 匹配非空白符 |
ps: 1.^与$的组合能够明确的限制想要查找的具体数据
2.管道符 | 在很多场景下的意思都是或
3.() 用于后续的正则起别名,分组获取对应数据
正则表达式之量词
量词不能单独使用,必须跟在表达式的后面并且只能影响紧挨着的左边那一个
在正则表达式中所有的量词默认都是贪婪匹配(尽可能多的)
量词 | 用法说明 |
---|---|
* | 重复零次或更多次(默认就是尽可能多) |
+ | 重复一次或更多次(默认就是尽可能多) |
? | 重复零次或一次(默认就是一次) |
重复n次 | |
重复n次或更多次 | |
重复n到m次 |
正则表达式练习题
正则 | 待匹配字符 | 匹配结果 | 说明 |
---|---|---|---|
海. | 海燕海娇海东 | 海燕海娇海东 | 匹配所有"海."的字符 |
^海. | 海燕海娇海东 | 海燕 | 只从开头匹配"海." |
海.$ | 海燕海娇海东 | 海东 | 只匹配结尾的"海.$" |
李.? | 李杰和李莲英和李二棍子 | 李杰 李莲 李二 |
?表示重复零次或一次,即只匹配"李"后面一个任意字符 |
李.* | 李杰和李莲英和李二棍子 | 李杰和李莲英和李二棍子 | *表示重复零次或多次,即匹配"李"后面0或多个任意字符 |
李.+ | 李杰和李莲英和李二棍子 | 李杰和李莲英和李二棍子 | +表示重复一次或多次,即只匹配"李"后面1个或多个任意字符 |
李. | 李杰和李莲英和李二棍子 | 李杰和 李莲英 李二棍 |
{1,2}匹配1到2次任意字符 |
李[杰莲英二棍子]* | 李杰和李莲英和李二棍子 | 李杰 李莲英 李二棍子 |
表示匹配"李"字后面[杰莲英二棍子]的字符任意次 |
李 [ ^ 和 ] * | 李杰和李莲英和李二棍子 | 李杰 李莲英 李二棍子 |
表示匹配一个不是"和"的字符任意次 |
[\d] | 456bdha3 | 4 5 6 3 |
表示匹配任意个数字,匹配到2个结果 |
[\d]+ | 456bdha3 | 456 3 |
表示匹配任意个数字,匹配到2个结果 |
贪婪匹配与非贪婪匹配
待匹配的文本:<script>alert(123)</script>
正则表达式:<.*> # 贪婪匹配
上述正则匹配出来的内容是:<script>alert(123)</script>
正则表达式:<.*?> # 非贪婪匹配
上述正则匹配出来的内容是:<script> </script>
"""
所有的量词默认都是贪婪匹配 但是如果在量词的后面紧跟一个问号
那么就会变成非贪婪匹配
小技巧:以后我们在使用贪婪匹配或者非贪婪匹配的时候一般都是用.*或者.*?
并且结束的标志有上述符号左右两边添加的表达式决定
"""
取消转义
正则表达式中取消斜杠与字母的特殊含义就是在斜杠前面加斜杠
正则 | 待匹配字符 | 匹配结果 | 说明 |
---|---|---|---|
\ \n | \n | \n | 转义\之后变成\ ,即可匹配 |
'\ \ \ \n' | '\ \n' | '\ \n' | 如果在python中,字符串中的''也需要转义,所以每一个字符串''又需要转义一次 |
r'\ \n' | r'\n' | r'\n' | 在字符串之前加r,让整个字符串不转义 |
正则表达式实战
编写校验用户手机号的正则
0?(13|14|15|17|18|19)[0-9]{9}
编写校验用户身份证的正则
\d{17}[\d|x]|\d{15}
编写校验用户邮箱的正则
\w[-\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\.)+[A-Za-z]{2,14}
编写校验用户qq号的正则
[1-9]([0-9]{5,11})
"""
常见的正则百度查找即可 我们需要做的是到时候能够看懂别人写的
能够完成基础的修改即可
"""
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了