PythonDay8Advance

news/2024/12/2 18:31:42/文章来源:https://www.cnblogs.com/Roxan-bd/p/18582458

PythonDay8Advance

正则表达式

  • 本身也是一个字符串,其中的字符具有特殊含义,将来我们可以根据这个字符串【正则表达式】去处理其他的字符串,比如可以对其他字符串进行匹配,切分,查找,替换等一系列操作。
  • 是一个独立于任何一门语言的技术,任何一门语言中都可以使用同一个正则表达式去操作
s1 = '博主讲的太好了!已经三连加关注,求课件!我的邮箱是1234214@qq.com, 或者是3255@163.cn 或者是微信手机号 18356781451'

正则表达式的便利之处

  • 需求:从上述字符串中,将所有符合邮箱的字符串查找出来。
  • 需求:从上述字符串中,将手机号查找出来
# python内置的一个库 re 这个库中的模块是专门针对正则表达式提供的
# 正则表达式在python中写的时候,在字符串引号前面加上r,表示这是一个正则表达式
import res1 = '博主讲的太好了!已经三连加关注,求课件!我的邮箱是 1234214@qq.com, 或者是 3255@163.com 或者是微信手机号 18356781451'
res1 = re.findall(r'^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$', s1)
print(res1)# ===================================================
import res1 = '博主讲的太好了!已经三连加关注,求课件!我的邮箱是 1234214@qq.com, 或者是 3255@163.com 或者是微信手机号 18356781451'
res1 = re.findall(r'\d{11}', s1)
print(res1)

正则表达式的编写步骤

  • 需要大量的文本信息
  • 找规律
  • 使用正则语法编写出正则表达式

正则表达式的语法

  • 字符串本身就是一个正则表达式
import res1 = '博主讲的太好了!已经三连xiaohu加关注,求课件!我的邮箱是 1234214@qq.com, 或者xiaohu是 3255@163.com 或者是xiaohu微信手机号 18356781451'
res1 = re.findall('xiaohu', s1)
print(res1)
  • [] 表示可选项
import res1 = '博主讲的太好了!已经三连xiaohuq加关注,求课件!我的邮箱是 1234214@qq.com, 或者xiaohuw是 3255@163.com 或者是xiaohup微信手机号 18356781451'
res1 = re.findall('xiaohu[qwp]', s1)
print(res1)
  • 范围

    • [a-z] 表示查找 a-z
    import res1 = '博主讲的太好了!已经三连xiaohuq加关注,求课件!我的邮箱是 1234214@qq.com, 或者xiaohu5是 3255@163.com 或xiaohu8者是xiaohuw微信手机号 18356781451'
    res1 = re.findall(r'xiaohu[a-z]', s1)
    print(res1)
    
    • [A-Za-z]
    import res1 = '博主讲的太好了!已经三连xiaohuq加关注,求课件!我xiaohuA的邮箱是 1234214@qq.com, 或者xiaohu5是 3255@163.com 或xiaohu8者是xiaohuU微信手机号 18356781451'
    res1 = re.findall(r'xiaohu[A-Za-z]', s1)
    print(res1)
    
    import res1 = '博主讲的太好了!已经三连xiaohuq加关注,求课件!我xiaohuA的邮箱是 1234214@qq.com, 或者xiaohu5是 3255@163.com 或xiaohu8者是xiaohuU微信手机号 18356781451'
    res1 = re.findall(r'xiaohu[A-z]', s1)
    print(res1)
    
    • [0-9]
    import res1 = '博主讲的太好了!已经三连xiaohuq加关注,求课件!我xiaohuA的邮箱是 1234214@qq.com, 或者xiaohu5是 3255@163.com 或xiaohu8者是xiaohuU微信手机号 18356781451'
    res1 = re.findall(r'xiaohu[0-9]', s1)
    print(res1)
    
    import res1 = '博主讲的太好了!已经三连xiaohuq加关注,求课件!我xiaohuA的邮箱是 1234214@qq.com, 或者xiaohu5是 3255@163.com 或xiaohu8者是xiaohuU微信手机号 18356781451'
    res1 = re.findall(r'xiaohu[0-z]', s1)
    print(res1)
    

    注意:开发中尽量不要使用0-z ,因为中间的ASCII码符号,还包含了其他特殊的符号

  • \d 表示数字

import res1 = '博主讲的太好了!已经三连xiaohuq加关注,求课件!我xiaohuA的邮箱是 1234214@qq.com, 或者xiaohu5是 3255@163.com 或xiaohu89者是xiaohuU微信手机号 18356781451'
res1 = re.findall(r'xiaohu\d\d', s1)
print(res1)
  • 数量

    • ?表示出现了0次或者1次
    import res1 = '博主讲的太好xiaohu了!已经三连xiaohuq加关注,求课件!我xiaohu124453的邮箱是 1234214@qq.com, 或者xiaohu5是 3255@163.com 或xiaohu89者是xiaohuU微信手机号 18356781451'
    res1 = re.findall(r'xiaohu\d?', s1)
    print(res1)
    
    • + 表示出现了1次或者n次
    import res1 = '博主讲的太好xiaohu了!已经三连xiaohuq加关注,求课件!我xiaohu124453的邮箱是 1234214@qq.com, 或者xiaohu5是 3255@163.com 或xiaohu89者是xiaohuU微信手机号 18356781451'
    res1 = re.findall(r'xiaohu\d+', s1)
    print(res1)
    
    • * 表示出现了0次或者n次
    import res1 = '博主讲的太好xiaohu了!已经三连xiaohuq加关注,求课件!我xiaohu124453的邮箱是 1234214@qq.com, 或者xiaohu5是 3255@163.com 或xiaohu89者是xiaohuU微信手机号 18356781451'
    res1 = re.findall(r'xiaohu\d*', s1)
    print(res1)
    
  • {m,n} 表示出现的次数范围,m表示至少出现的次数,n表述最多出现的次数

import res1 = '有一个同学的学号为sj331001, 另一个同学的学号为sj32100, 还有一个同学的学号为sj3101, 还有一个学生:sj322010'
# res1 = re.findall(r'sj32\d+', s1)
res1 = re.findall(r'sj\d{2,6}', s1)
print(res1)
  • {m,} 表示出现的次数,至少为m个,上不封顶
import res1 = '有一个同学sj9的学号为sj331001, 另一个同学的学号为sj32100, 还有一个同学的学号为sj3101, 还有一个学生:sj322010, 新来的学生学号为:sj34567809'
# res1 = re.findall(r'sj32\d+', s1)
res1 = re.findall(r'sj\d{2,}', s1)
print(res1)
  • {m} 表示出现了m次
import res1 = '有一个同学sj9的学号为sj331001, 另一个同学的学号为sj32100, 还有一个同学的学号为sj3101, 还有一个学生:sj322010, 新来的学生学号为:sj34567809'
# res1 = re.findall(r'sj32\d+', s1)
res1 = re.findall(r'sj\d{6}', s1)
print(res1)
  • 匹配指定手机号
import re# 183 153 173
# 总共最多是11位
s1 = '我有一个手机号是18347821932,另一个手机号是17386429189,还有一个手机号是15356878621,以前用过一个手机号13987648345'
res1 = re.findall(r'1[857]3\d{8}', s1)
print(res1)
  • \w 表示英文字母大写或者小写,或者下划线,或者是中文汉字
import re# 183 153 173 
# 总共最多是11位
s1 = '我有一个邮箱是183478@qq.com,另一个邮箱是17386@163.com,还有一个邮箱是78621@gmail.com,以前用过一个邮箱139876@qq.com'
res1 = re.findall(r'\d+@\w+\.com', s1)
print(res1)
import re# 183 153 173 
# 总共最多是11位
s1 = '我有一个邮箱是hys183478@qq.com,另一个邮箱是17386zcy@163.com,还有一个邮箱是786zrx21@gmail.com,以前用过一个邮箱139876@qq.com'
res1 = re.findall(r'\w+@\w+\.com', s1, re.ASCII)
print(res1)

上述案例中,如果我们没有写re.ASCII参数,那么第一个\w+会将汉字也匹配上,因为\w本身就可以匹配汉字的,但是当我们加上了re.ASCII参数,python正则表达式匹配的时候,\w只会匹配ASCII码上有的字符。

  • \W 表示除了大小写英文字母,数字,汉字,下划线之外,都能匹配
import re# 183 153 173 
# 总共最多是11位
s1 = '我有一个邮箱是hys183478@###.com,另一个邮箱是17386zcy@163.com,还有一个邮箱是786zrx21@gmail.com,以前用过一个邮箱139876@qq.com'
res1 = re.findall(r'\w+@\W+\.com', s1, re.ASCII)
print(res1)
  • 匹配以某个字符串开头
import re# 183 153 173 
# 总共最多是11位
s1 = '我有一个邮箱是hys183478@qq.com,另一个邮箱是17386zcy@163.com,还有一个邮箱是zrx78621@gmail.com,以前用过一个邮箱139876@qq.com'
res1 = re.findall(r'[A-z]+\d+@\w+\.com', s1, re.ASCII)
print(res1)
  • ^ 表示以某个字符串开头
s2 = 'hys183478@qq.com'
res2 = re.match(r'^hys', s2, re.ASCII)
print(res2)
  • $ 表示以某个字符串结尾
  • () 分组
import re# 183 153 173 
# 总共最多是11位
s1 = '有一个学生的身份证号为340123200312075687,另一个学生的身份证号是340122199705035414'
res1 = re.findall(r'(340\d{3}(\d{4})\d{8})', s1)
print(res1) # [('340123200312075687', '2003'), ('340122199705035414', '1997')]
import re# 183 153 173 
# 总共最多是11位
s1 = '有一个学生的身份证号为340123200312075687,另一个学生的身份证号是340122199705035414'
res1 = re.findall(r'(340\d{3}(\d{4})(\d{2})(\d{2}))', s1)
print(res1) # [('34012320031207', '2003', '12', '07'), ('34012219970503', '1997', '05', '03')]
  • 或 | 多个字符之间的或使用小括号
import re# 183 153 173 
# 总共最多是11位
s1 = '有一个学生的身份证号为340123200312075687,另一个学生的身份证号是340122199705035414,另一个学生的身份证号是340110199705035414'
res1 = re.findall(r'(340(123|110)(\d{4})(\d{2})(\d{2}))', s1)
print(res1) # [('34012320031207', '123', '2003', '12', '07'), ('34011019970503', '110', '1997', '05', '03')]
  • . 表示任意字符
import res1 = '我有一个键盘,键盘的售卖序列号为JP2134WFWFasd##&13, 上一个键盘的序列号为JPIUYT4WFqw34sd##&'
res1 = re.findall(r'JP.{16}', s1)
print(res1) # ['JP2134WFWFasd##&13', 'JPIUYT4WFqw34sd##&']

使用\转义字符,将.变成普通的点字符进行匹配

s1 = '我有shujia#888一个键盘,键盘的售shujia.666卖序列号为JP2134WFW.asd##&13, 上一个键盘的序列号为JPIUYT4WFqw34sd##&'
res1 = re.findall(r'shujia\.\d{3}', s1)
print(res1) # ['shujia.666']

re模块中的常用函数

  • re.findall 在大字符串中查找符合正则表达式特点的式子

  • re.match() 匹配整个字符串是否符合某个正则表达式特点

  • re.search() 从左向右匹配正则表达式,只会匹配一次符合条件, 得到的是一个对象

import re
text = '博主讲的实在是太1165872335@数加.com好了,通俗易懂,已三连,求课件,我的邮箱是1165872335@qq.com或' \'者是xiaohu2023666@pronton.com谢谢博主 手xiaohu2机微信号也可以17354074069'res1 = re.search(r'1\d+@\w+\.com',text)
print(res1) # <re.Match object; span=(8, 25), match='1165872335@数加.com'>
print(res1.group())
  • re.split()
import re
text = '1001,xiaohu#18足$踢球'res1 = re.split(r'[,#$]',text)
print(res1) # ['1001', 'xiaohu', '18', '踢足球']
  • re.finditer() 在大字符串中查找符合正则表达式特点的式子,得到的是一个迭代器
import re
text = '博主讲的实在是太1165872335@数加$.com好了,通俗易懂,已三连,求课件,我的邮箱是 1165872335@qq.com 或' \'者是xiaohu2023666@pronton.com谢谢博主 手xiaohu2机微信号也可以17354074069'res2 = re.findall('(\w+@(数加\$|qq|pronton)\.com)',text, re.ASCII)
print(res2) # [('1165872335@数加$.com', '数加$'), ('1165872335@qq.com', 'qq'), ('xiaohu2023666@pronton.com', 'pronton')]res1 = re.finditer('(\w+@(数加\$|qq|pronton)\.com)',text, re.ASCII)
for res in res1:print(res.group(1))print(res.group(2))print("-----------------------")
  • fullmatch() 将字符串整体与正则表达式进行匹配
text = '安徽省-合肥市-蜀山区-浮山路'res1 = re.fullmatch(f'(\w+)-(\w+)-(\w+)-(\w+)', text)
print(f"省份:{res1.group(1)}")
print(f"市:{res1.group(2)}")
print(f"区:{res1.group(3)}")
print(f"街道:{res1.group(4)}")

Numpy模块

做矩阵分析时所需的第三方模块

  • 在python使用numpy创建一个矩阵
import numpy as nplist1 = [[1,2,3,4],[4,5,6,8],[7,8,9,3]]array1 = np.array(list1)
print(array1, type(array1))

注意:如果列表中的小列表的列数不一致,那么就会将每一个小列表当作一个矩阵中的元素去存放,这个矩阵只有一行。

矩阵的常见属性

  • ndim 查看矩阵的维度
import numpy as nplist1 = [[1,2,3,4],[4,5,6,8],[7,8,9,3]]array1 = np.array(list1)
print(array1, type(array1))print(array1.ndim) # 2
  • shape 查看矩阵的行数和列数
import numpy as nplist1 = [[1,2,3,4],[4,5,6,8],[7,8,9,3]]array1 = np.array(list1)
print(array1, type(array1))print(array1.shape) # (3, 4)
  • size 查看矩阵中元素的个数
import numpy as nplist1 = [[1,2,3,4],[4,5,6,8],[7,8,9,3]]array1 = np.array(list1)
print(array1, type(array1))print(array1.size) # 12
  • dtype 查看矩阵中的元素类型
import numpy as nplist1 = [[1,2,3,4],[4,5,6,8],[7,8,9,3]]array1 = np.array(list1)
print(array1, type(array1))print(array1.dtype) # int32

numpy中矩阵的使用和常用函数

  • numpy 可以使用采用索引进行取值 array1[行的范围, 列的范围]
import numpy as nplist1 = [[1, 2, 3, 4], [4, 5, 6, 8], [7, 8, 9, 3]]array1 = np.array(list1)
print(array1, type(array1))
print("--------------------")
print(array1[:, :2])
print("--------------------")
print(array1[1, 1:3])
  • astype 将元素转成对应的数据类型
import numpy as nplist1 = [[1, 2, 3, 4], [4, 5, 6, 8], [7, 8, 9, 3]]array1 = np.array(list1)
print(array1, type(array1))
print(array1.dtype)
print("--------------------")
array1 = array1.astype('float')
print(array1, type(array1))
print(array1.dtype)
  • split 按照指定的方向将矩阵切分

axis: 默认是0,按照的方向切分,可以修改为1,按照进行切分

import numpy as nplist1 = [[1, 2, 3, 4], [4, 5, 6, 8], [7, 8, 9, 3], [11,22,33,44]]array1 = np.array(list1)
print(array1, type(array1))
print(array1.dtype)
print("--------------------")
res1 =np.split(array1,2, axis=1)
print(res1, type(res1))

指定索引切分若干个部分矩阵

res1 = np.split(array1, [1, -1])
  • reshape 重构矩阵

需要注意:结果矩阵的元素个数和原本的元素个数保持一致

array1 = array1.reshape(4,3)
print(array1)
  • vstack 将两个矩阵上下拼接
  • hstack 将两个矩阵左右拼接
  • dot() 点乘
print(array1.dot(array2))
  • diff() 差分
res1 = np.diff(array1,axis=1)
print(res1, type(res1))
  • 数学计算
print(np.amax(array1))
print(np.amin(array1))
print(np.mean(array1)) # 平均值
print(np.median(array1)) # 中位数
print(np.std(array1)) # 2.48327740429189 标准差
print(np.var(array1)) # 6.166666666666667 方差   比如计算偏科这样的需求

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/845551.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jQuery和CSS3折叠卡片式下拉列表框特效

这是一款使用JQUERY和CSS3制作的效果非常炫酷的折叠卡片式下拉列表框特效。该下拉列表框特效将每一个列表项都制作为卡片的样式,打开和关闭它有打开和关闭百叶窗的感觉,效果非常不错。预览 下载使用方法HTML结构 该下拉列表框特效的列表项使用一个无序列表来制作,用于切换…

幂等设计:确保操作的安全与可靠

目录一、概述1.1、什么是幂等1.2、为什么需要幂等?二、幂等如何设计实现幂等的8 种方案select+insert+主键/唯一索引冲突状态机幂等抽取防重表token令牌悲观锁(如select for update)乐观锁分布式锁三、HTTP的幂等 一、概述 在分布式系统和微服务架构中,确保操作的安全性和可靠…

从仪表盘探索 MongoDB 关键指标

这是 MongoDB 监控系列文章的第七篇,前面几篇文章的链接如下:MongoDB 监控(一) MongoDB 监控(二) MongoDB 监控(三) MongoDB 监控(四) MongoDB 监控(五) MongoDB 监控(六)按照前面系列文章,我们已经采集到 MongoDB 的监控数据了,并且通过 Grafana 和 Nightinga…

微服务引擎 MSE 及云原生 API 网关 2024 年 10 月产品动态

微服务引擎 MSE 及云原生 API 网关 2024 年 10 月产品动态

20222425 2024-2025-1 《网络与系统攻防技术》实验七实验报告

1.实验内容 本周学习内容:本周我们学了web安全的章节,首先我们了解了前端和后端技术,其次我们学习了一些web安全攻防的内容,例如SQL注入和XSS跨站脚本攻击、CSRF以及安全防范的内容。在实验的过程中我们学到了网络欺诈与防范技术。 2.实验过程 主机IP:192.168.35.1 kali(…

基于Bootstrap3的简单柱状图表插件

jchart是一款简单小巧的基于Bootstrap3.x的jquery柱状图表插件。该柱状图片表插件通过简单的设置,就可以生成非常漂亮的水平柱状图,并带有水平和垂直标签以及图表的头部和尾部。 在线演示 下载 使用方法 该jQuery柱状图插件可以通过javascript来调用,也可以直接使用HTML标…

编译OpenCV——jetson嵌入式平台

jetson嵌入式平台的系统为:ubuntu20.04 aarch64 不再研究Ubuntu x64上交叉编译ubuntu aarch64的OpenCV库,因为无法识别到arm的GTK导致编译不进去,最终imshow时会报如下错误:modules/highgui/src/window.cpp:611:error: (-2) The function is not implemented. Rebuild the …

Breakout pg walkthrough Intermediate

nmap ┌──(root㉿kali)-[~/lab] └─# nmap -p- -A 192.168.192.182 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-12-02 04:50 UTC Nmap scan report for 192.168.192.182 Host is up (0.071s latency). Not shown: 65533 closed tcp ports (reset) PORT STATE SE…

从开发者工具转型 AI 呼叫中心,这家 Voice Agent 公司已服务 100+客户

Retell.ai 的 5 位联创。(图:maginative.com)Retell AI 提供一个平台,用于构建和部署可进行自然、类人对话的 AI voice agent,赋能呼叫中心,替代或辅助人工座席。Retell AI 起初为构建 voice agent 产品的开发者提供 API,现已将重点转向为中型企业提供完整的 AI 呼叫中心…

实验5文档部分代码

实验一找到输入数据中的最大值和最小值 指向x[0]输出最大数 可以 实验二80 s1的内存大小和字符串长度 能 s1存储的内容是字符串"Learning makes me happy",而sizeof(s1)返回的是整个指针类型的大小\ 不能 在原始代码中,通过赋值的方式为s1分配内存空间,并初始化其…

IC Compiler II(ICC II)后端设计流程——超详细

Preface 本文中英文结合(学习一些专有名词),主要介绍ICC II软件进行后端设计的主要流程,在阅读之前需要对数字IC设计流程有一定的了解。 逻辑综合相关知识请查看:Synopsys逻辑综合及DesignCompiler的使用(想了解逻辑综合的可以看看这个,但内容较多) 数字IC设计整体流程…