正则表达式及相关
正则表达式及相关
- 正则表达式前戏
- 正则表达式基本使用
- 正则表达式特殊符号
- 正则表达式量词
- 正则表达式贪婪与非贪婪匹配
- 正则表达式取消转义
- python内置模块之re模块
正则表达式前戏
需求:模仿京东商城的用户手机号登录验证
需求解析:
1.很多的校验规则
2.必须是纯数字,而且是11位,而且开头必须是常规的手机号开头
# 上述的规则能否使用python代码实现?如何实现?
# 1.获取用户的手机号
phone_num = input('请输入您的手机号>>>:').strip()
# 2.先校验是否是11位
if len(phone_num) == 11:
# 3.再校验是否是纯数字
if phone_num.isdigit():
# 4.校验开头是否合法
if phone_num.startswith('13') or phone_num.startswith('15') or phone_num.startswith(
'17') or phone_num.startswith('18'):
print('这是一个正常的手机号')
else:
print('手机号开头不合法')
else:
print('手机号必须是纯数字')
else:
print('手机号必须是11位')
# 使用正则表达式编写
import re
while True:
number = input('please enter your number>>>>>:').strip()
if re.match('^(13|15|17|18)[0-9]{9}$', number):
print('login success')
else:
print('login default')

"""
正则表达式是一门独立的语言 专门用来匹配、校验、筛查所需要的数据
任何编程语言都可以使用 在python中如果想用就必须借助于内置模块re
"""
概述:什么是正则表达式
利用一些'特殊符号'的组合去字符串中筛选出想要的数据
正则表达式之字符组
[0123456789] 匹配0到之间的任意一个数字
[0-9] 匹配0到9之间的任意一个数字
[a-z] 匹配a到z之间的任意一个小写字母
[A-Z] 匹配A到Z之间的任意一个大写字母
[0-9a-zA-z] 匹配任意一个数字或者大小写字母(无序)
正则表达式之特殊符号
# 特殊符号默认也是一次匹配一个字符
. 匹配除换行符以外的任意字符
\w 匹配数字、字母、下划线
\d 匹配任意的数字
\t 匹配一个制表符(tab键)
^ 匹配字符串的开始
eg:^9 找9并且这个9必须在开头
$ 匹配字符串的结尾
eg:9$ 找9并且这个9必须在末尾
\W 匹配非字母或数字或下划线
\D 匹配非数字
a|b 匹配a或者b 管道符就or(或)的意思
() 给正则表达式分组 不影响正则匹配
[] 字符组的概念(里面所有的数据都是或的关系)
[^] 上箭号出现在了中括号的里面意思是取反操作
正则表达式之量词
"""
量词必须跟在表达式的后面 不能单独使用 目的是增加匹配的字符数
"""
# 量词默认都是贪婪匹配(尽可能多的匹配)
* 重复零次或者多次(默认就是多次:越多越好)
+ 重复一次或者多次(默认就是多次:越多越好)
? 重复零次或者一次(默认就是一次:越多越好)
{n} 重复n次
{n,} 重复最少n次最多多次(越多越好)
{n,m} 重复n到m次(越多越好)
取消转义
\n \n False
\\n \n True
\\\\n \\n True
在python中还可以在字符串的前面加r取消转义 更加方便
贪婪匹配与非贪婪匹配
# 贪婪匹配 .*
# 非贪婪匹配 .*?
eg:
<p>这是标题<p>
<.*> >>>>>>>> 一条结果
<.*?> >>>>>>>> 两条结果
量词默认都是贪婪匹配 如果想修改为非贪婪匹配 只需要在量词的后面加?即可
贪婪非贪婪通常都是利用左右两边的条件作为筛选依据
re模块
# 在python中无法直接使用正则 需要借助于模块
1.内置的re模块
2.第三方的其他模块
import re
res = re.findall('a', 'jason oscar aaa') # findall(正则表达式,待匹配的文本)
print(res) # ['a', 'a', 'a', 'a', 'a'] # 结果是所有符合条件的数据 并且组织成了列表
res1 = re.search('a', 'jason oscar aaa') # search(正则表达式,待匹配的文本)
print(res1) # 查找到一个符合条件的数据就结束 没有则返回None
print(res1.group()) # a 没有则无法调用group() 直接报错
res2 = re.match('j', 'jason oscar aaa') # match(正则表达式,待匹配的文本)
print(res2) # None 从字符串的开头匹配 如果没有则直接返回None 类似于给正则自动加了^ 如果符合也只获取一个就结束
print(res2.group()) # j 没有则无法调用group() 直接报错
res3 = re.finditer('a', 'jason oscar aaa') # finditer(正则表达式,待匹配的文本)
print(res3) # 结果是一个迭代器对象 为了节省空间
print([obj.group() for obj in res3]) # ['a', 'a', 'a', 'a', 'a']
obj = re.compile('\d+') # 提前写好后续需要经常使用的正则
print(re.findall(obj,'asjd21hj13123j')) # 写一遍之后 直接反复调用即可
print(re.findall(obj,'234328748hgjghj')) # 写一遍之后 直接反复调用即可
print(re.findall(obj,'jhjhjh423432423')) # 写一遍之后 直接反复调用即可
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人