python进阶之路20 正则表达式 re模块
正则表达式前情
案例:京东注册手机号校验
基本需求:手机号必须是11位、手机号必须以13、15、17、18、19开头、必须是纯数字
'''纯python代码实现'''
# while True:
# # 1.获取用户输入得手机号
# phone_num = input('请输入您的手机号码>>>:').strip()
# # 2.先判断是否是十一位
# 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('19'):
# print('手机号码正确')
# else:
# print('手机号码必须是纯数字')
# else:
# print('手机号必须是11位')
"""
python结合正则实现
"""
import re
phone_number = input('please input your phone_number:')
if re.match('^(13|14|15|18)[0-9]{9}$',phone_number):
print('是合法的手机号码')
else:
print('不是合法的手机号码')
"""
正则表达式是一门独立的技术 所有编程语言都可以使用它的作用可以简单的概括为:利用一些特殊符号(也可直接写需要查找的具体字符)的组合产生一些特殊的含义然后去字符串中筛选出符合条件的数据
>>>:筛选数据(匹配数据)
"""
字符组
'''字符组默认匹配方式 是挨个挨个匹配'''
[0123456789] 匹配0到9任意一个数(全写)
[0-9] 匹配0到9任意一个数(缩写)
[a-z] 匹配26个小写英文字母
[A-Z] 匹配26个大写英文字母
[0-9][a-z][A-Z] 匹配数字或者小写字母或者大写字母
ps:字符组内所有的数据默认都是或的关系
特殊符号
'''特殊符号默认匹配方式是挨个挨个匹配'''
. 匹配除换行符以外的任意字符
\w 匹配数字、字母、下划线
\W 匹配非数字、非字母、非下划线
\d 匹配数字
^ 匹配字符串的开头
$ 匹配字符串的结尾
两者组合使用可以非常精确的限制匹配的内容
a|b 匹配a或者b(管道符的意思是或)
() 给正则表达式分组 不影响表达式的匹配功能
[] 字符组 内部填写的内容默认都是或的关系
[^] 取反操作匹配除了字符组里面的其他所有字符
注意上尖号在中括号内和中括号意思完全不同
量词
'''正则表达式默认情况下都是贪婪匹配>>>:尽可能多的匹'''
* 匹配零次或多次 默认是多次(无穷次)
+ 匹配一次或多次 默认是多次(无穷次)
? 匹配零次或一次 作为量词意义不大主要用于非贪婪匹配
{n} 重复n次
{n,} 重复n次或更多次 默认是多次(无穷次)
{n,m} 重复n到m次 默认是m次
ps:量词必须结合表达式一起使用 不能单独出现 并且只影响左边第一个表达式
jason\d{3} 只影响\d
课堂练习
参考
https://www.cnblogs.com/Dominic-Ji/articles/16046931.html#_label10
贪婪匹配与非贪婪匹配
"""
所有的量词都是贪婪匹配如果想要变为非贪婪匹配只需要在量词后面加问号"""
待匹配的文本
<script>alert(123)</script>
待使用的正则(贪婪匹配)
<.*>
请问匹配的内容
<script>alert(123)</script> 一条
# .*属于典型的贪婪匹配 使用它 结束条件一般在左右明确指定
待使用的正则(非贪婪匹配)
<.*?>
转义符
"""斜杠与字母的组合有时候有特殊含义"""
\n 匹配的是换行符
\\n 匹配的是文本\n
\\\\n 匹配的是文本\\n
ps:如果是在python中使用 还可以在字符串前面加r取消转义
正则表达式实战建议
1.编写校验用户身份证号的正则
^[1-9]\d{13,16}[0-9x]$
^[1-9]\d{14}(\d{2}[0-9x])?$
^([1-9]\d{16}[0-9x]|[1-9]\d{14})$
2.编写校验邮箱的正则
3.编写校验用户手机号的正则(座机、移动)
4.编写校验用户qq号的正则
"""很多时候 很多问题 前人已经弄好了 你只需要花点时间找一找就可以"""
ps:能够写出简单的正则 能够大致看懂复杂的正则
re模块
在python中如果想要使用正则 可以考虑re模块
import re
# 常见操作方法
# res = re.findall('a','jason apple eva')
# print(res) # 查找所有符合正则表达式要求的数据 结果直接是一个列表
# res = re.finditer('a','jason apple eva')
# print(res) # 查找所有符合正则表达式要求的数据 结果直接是一个迭代器对象
# res = re.search('a','jason apple eva')
# print(res) # <re.Match object; span=(1, 2), match='a'>
# print(res.group()) # a 匹配到一个符合条件的数据就立刻结束
# res = re.match('a','jason apple eva')
# print(res) # None 匹配开头符合条件的数据 一个就结束
# obj = re.compile('\d{3}') # 当某一个正则表达式需要频繁使用的时候 我们可以做成模板
# res1 = obj.findall('2223323234324325235423424243242354432')
# res2 = obj.findall('adasafaasda2312323213123')
# print(res1,res2) # ['222', '332', '323', '432', '432', '523', '542', '342', '424', '324', '235', '443'] ['231', '232', '321', '312']
# ret = re.split('[ab]','abcd') # 先按'a'分割得到''和bcd,在对''和'bcd'分别按'b'分割
# print(ret) # ['', '', 'cd']
ret = re.sub('\d', 'H', 'eva3jason4yuan4', 1) # 将数字替换成'H',参数1表示只替换1个
print(ret) # evaHjason4yuan4
ret1 = re.subn('\d', 'H', 'eva3jason4yuan4') # 将数字替换成'H',返回元组(替换的结果,替换了多少次)
print(ret1) # ('evaHjasonHyuanH', 3)
re模块补充说明
import re
1.分组优先
# res = re.findall('www.(baidu|oldboy).com','www.oldboy.com')
# print(res) # ['oldboy']
# findall 分组优先展示:优先展示括号内正则表达式 匹配到的内容
# res1 = re.findall('www.(?:baidu|oldboy).com','www.oldboy.com')
# print(res1) # ['www.oldboy.com']
# res = re.search('www.(baidu|oldboy).com','www.oldboy.com')
# print(res.group()) # www.oldboy.com
# res1 = re.match('www.(baidu|oldboy).com','www.oldboy.com')
# print(res1.group()) # www.oldboy.com
2.分组别名
res = re.search('www.(?P<content>baidu|oldboy)(?P<hei>.com)','www.oldboy.com')
print(res.group()) # www.oldboy.com
print(res.group('content')) # oldboy
print(res.group(0)) # www.oldboy.com
print(res.group(1)) # oldboy
print(res.group(2)) # .com
print(res.group('hei')) # .com
网络爬虫简介
网络爬虫:通过编写代码模拟浏览器发送请求获取数据并按照自己指定的要求筛选出想要的数据
python进阶之路20 正则表达式 re模块的更多相关文章
- Python进阶(十)----软件开发规范, time模块, datatime模块,random模块,collection模块(python额外数据类型)
Python进阶(十)----软件开发规范, time模块, datatime模块,random模块,collection模块(python额外数据类型) 一丶软件开发规范 六个目录: #### 对某 ...
- Python进阶【第十一篇】模块(下)之常用模块
内置模块是Python自带的功能,在使用内置模块相应的功能时,需要[先导入]再[使用] 一.time模块 在Python中,通常有这几种方式来表示时间: 时间戳(timestamp):通常来说,时间戳 ...
- Python进阶-XII serialize(序列化)、序列化模块
一.serialize 序列化 1.什么叫序列化——将原本的字典.列表等内容转换成一个字符串的过程就叫做序列化. 比如,我们在python代码中计算的一个数据需要给另外一段程序使用,那我们怎么给?现在 ...
- python进阶之路之文件处理
Python之文件处理 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !imp ...
- Python进阶之路---1.4python数据类型-数字
python入门基础 声明:以后python代码未注明情况下,默认使用python3.x版本 1.python代码基础:print print('hello,python') 1.1pyt ...
- Python进阶之路---1.2python版本差异
Python2.*与python3.*版本差异 作为一个初学者,我们应该如何选择python的版本进行学习呢,这两个版本有什么区别呢,接下来让我们简单了解一下,以便我们后续的学习. Python版本差 ...
- Python进阶之路---1.1python简介
Python简介 Python简介 Python (发音:[ 'paiθ(ə)n; (US) 'paiθɔn ]n.蟒蛇,巨蛇 ),是一种面向对象的解释 ...
- python进阶(8):常用模块2+异常处理
前段时间讲了很多的模块应为当时面向对象没有讲有几个没有说今天补上,再说一个异常处理. 一.hashlib模块 Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 摘要算法又称哈 ...
- Python进阶【第十篇】模块(上)
·一.模块 模块就是一组功能的集合体,我们的程序可以导入模块来复用模块里的功能.为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这 ...
- python学习之路-第四天-模块
模块 sys模块 sys.argv:参数列表,'using_sys.py'是sys.argv[0].'we'是sys.argv[1].'are'是sys.argv[2]以及'arguments'是sy ...
随机推荐
- if、where、trim、choose、when、otherwise、foreach
1.if if标签可通过test属性的表达式进行判断,若表达式的结果为true,则标签中的内容会执行:反之标签中 的内容不会执行 <!--List<Emp> getEmpListBy ...
- linux系统配置文件或shell脚本批量注释
1. 配置文件批量注释 1.1 批量注释 ① 进入命令行模式,按ctrl + v进入 visual block模式,键盘上下箭头选中多行,把需要注释的行标记起来 ② 按大写字母I,再输入注释符:# ③ ...
- day14-HTTP01
HTTP协议 1.什么是HTTP协议? 超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用广泛的一种网络协议.是工作在tcp/ip协议基础上的,所有的ww ...
- Day06:运算符详解
运算符 算术运算符:+,-,*,/,%(取余:也叫模运算),++(自增),--(自减)........... 二次运算符+,-,*,/ int a=10; int b=20; int c=50; in ...
- Vue3 企业级优雅实战 - 组件库框架 - 3 搭建组件库开发环境
前文已经初始化了 workspace-root,从本文开始就需要依次搭建组件库.example.文档.cli.本文内容是搭建 组件库的开发环境. 1 packages 目录 前面在项目根目录下创建了 ...
- EBI、DDD及其演变架构史
一.引子 聊架构总离不开"领域驱动架构",大多能聊到DDD(Domain-Driven Design),实际上早期思想EBI架构 1992年就诞生了.核心价值点在于:关注核心业务领 ...
- 一年一度!GitHub 开发者大会「GitHub 热点速递 v.22.45」
GitHub 是全球最大的开源社区,它的一举一动都深受每一位开源爱好者的关注.这周末刚落下帷幕的<GitHub Universe 2022>是 GitHub 发布最新产品.功能.报告和计划 ...
- 嵌入式-C语言基础:指针偏移打印数组
在C语言中,数组名代表数组中首元素的地址,所以,下面两句获取数组的首地址是等价的: #include<stdio.h> int main() { int a[5]={1,2,3,4,5}; ...
- Windows Server 2019 安装 Oracle 19C RAC(VMWare虚拟机环境)
软件 Windows Server 2019 Standard Oracle 19C Oracle Grid 19 VMware Workstation 16 规划 共享存储,使用Windows Se ...
- 单节点部署 gpmall 商城
个人名片: 对人间的热爱与歌颂,可抵岁月冗长 Github:念舒_C.ying CSDN主页️:念舒_C.ying 个人博客 :念舒_C.ying 1 修改主机名: [root@localhost ...