python利用什么模块_python常用模块-1

一、认识模块

1、什么是模块:一个模块就是一个包含了python定义和声明的文件,文件名就是加上.py的后缀,但其实import加载的模块分为四个通用类别 :

1.使用python编写的代码(.py文件)

2.已被编译为共享库二和DLL的C或C++扩展

3.包好一组模块的包

4.使用C编写并连接到python解释器的内置模块

2、为何要使用莫模块?

如果你想退出python解释器然后重新进入,那么你之前定义的函数或变量都将丢失,因此我们通常将程序写到文件中以便永久保存下来,需要时,就通过python test.py 方式去执行,此时test.py被称为脚本script。

随着程序的发展,功能越来越多,为了方便管理,我们通常将文件分成一个个的文件,这样做程序的结构更清晰,方便管理。这时我们不仅仅可以吧这些文件当做脚本去执行,还可以把它们当做模块来导入到其他模块中,实现了功能的重复利用。

二、常见模块分类

常用模块一:

collocations 模块

时间模块

random模块

os模块

sys模块

序列化模块

re模块

常用模块二:这些模块和面向对象有关

hashlib模块

configparse模块

logging模块

三、正则表达式

像我们平常见的那些注册页面啥的,都需要我们输入手机号码吧,你想我们的电话号码也是有限定的吧(手机号码一共11位,并且只以13,14,15,17,18开头的数字这些特点)如果你的输入有误就会提示,那么实现这个程序的话你觉得用While循环so easy嘛,那么我们来看看实现的结果。

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 whileTrue:2 phone_number=input('请输入你的电话号码:')3 if len(phone_number)==11 andphone_number.isdigit()\4 and (phone_number.startswith('13')\5 or phone_number.startswith('14') \6 or phone_number.startswith('15') \7 or phone_number.startswith('17') \8 or phone_number.startswith('18')):9 print('是合法的手机号码')10 else:11 print('不是合法的手机号码')

判断手机号码是否合法

看到这个代码,虽说理解很容易,但是我还有更简单的方法。那我们一起来看看吧。

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 importre2 phone_number=input('请输入你的电话号码:')3 if re.match('^(13|14|15|17|18)[0-9]{9}$',phone_number):4 '''^这个符号表示的是判断是不是以13|14|15|17|18开头的,5 [0-9]: []表示一个字符组,可以表示0-9的任意字符6 {9}:表示后面的数字重复九次7 $:表示结束符8 '''

9 print('是合法的手机号码')10 else:11 print('不是合法的手机号码')

判断手机号码输入是否合法

大家可能都觉的第一种方法更简单吧,但是如果我让你从整个文件中匹配出所有的手机号码,你能用python写出来吗?但是导入re模块和利用正则表达式就可以解决这一个问题了。

那么什么是正则呢?

首先你要知道的是,谈到正则,就只和字符串相关了。在线测试工具 http://tool.chinaz.com/regex/

比如你要用‘1’去匹配‘1’,或者用‘2’去匹配‘2’,直接就可以匹配上。

字符组:[字符组]

在同一位置可能出现的各种字符组成了一个字符组,在正则表达式中用[]表示

字符分为很多类,比如数字,字母,标点等登。

假如你现在要求一个位置‘只能出现一个数字’,那么这个位置上的字符只能是0、1、2、3.......9这是个数之一。

字符组:

368c365dcdc7e24121eb084fdb833e5e.png

字符:

8d48eccf122ec8b78f5b94c7ab39a7f9.png

量词:

6f1cb2e9dbedd849d702fffaa330371c.png

.^$

fad1033ae3656606f9209449c2ec14bd.png

*+?{}

8fc90c919e1485aa7f12cc0a54a7a484.png

注意:前面的*,+,?等都是贪婪匹配,也就是尽可能多的匹配,后面加?就变成了非贪婪匹配,也就是惰性匹配。

贪婪匹配:

376499ed1f400acb671d99f081dd0060.png

几个常用的配贪婪匹配

.*?的用法:

字符集:

d5cee75db7811ee4f26ca36652907763.png

分组()与或|[^]:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 举个例子,比如html源码中有

xxx标签,用以前的知识,我们只能确定源码中的和是固定不变的。因此,如果想获取页面标题(xxx),充其量只能写一个类似于这样的表达式:.*,而这样写匹配出来的是完整的xxx标签,并不是单纯的页面标题xxx。2

3 想解决以上问题,就要用到断言知识。4

5 在讲断言之前,读者应该先了解分组,这有助于理解断言。6

7 分组在正则中用()表示,根据小菜理解,分组的作用有两个:8

9

10

11 n 将某些规律看成是一组,然后进行组级别的重复,可以得到意想不到的效果。12

13 n 分组之后,可以通过后向引用简化表达式。14

15

16

17

18

19 先来看第一个作用,对于IP地址的匹配,简单的可以写为如下形式:20

21 \d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}22

23 但仔细观察,我们可以发现一定的规律,可以把.\d{1,3}看成一个整体,也就是把他们看成一组,再把这个组重复3次即可。表达式如下:24

25 \d{1,3}(.\d{1,3}){3}26

27 这样一看,就比较简洁了。28

29

30

31 再来看第二个作用,就拿匹配

xxx标签来说,简单的正则可以这样写:32

33

.*

34

35 可以看出,上边表达式中有两个title,完全一样,其实可以通过分组简写。表达式如下:36

37 .*\1>

38

39 这个例子实际上就是反向引用的实际应用。对于分组而言,整个表达式永远算作第0组,在本例中,第0组是.*\1>,然后从左到右,依次为分组编号,因此,(title)是第1组。40

41 用\1这种语法,可以引用某组的文本内容,\1当然就是引用第1组的文本内容了,这样一来,就可以简化正则表达式,只写一次title,把它放在组里,然后在后边引用即可。42

43 以此为启发,我们可不可以简化刚刚的IP地址正则表达式呢?原来的表达式为\d{1,3}(.\d{1,3}){3},里边的\d{1,3}重复了两次,如果利用后向引用简化,表达式如下:44

45 (\d{1,3})(.\1){3}46

47 简单的解释下,把\d{1,3}放在一组里,表示为(\d{1,3}),它是第1组,(.\1)是第2组,在第2组里通过\1语法,后向引用了第1组的文本内容。48

49 经过实际测试,会发现这样写是错误的,为什么呢?50

51 小菜一直在强调,后向引用,引用的仅仅是文本内容,而不是正则表达式!52

53 也就是说,组中的内容一旦匹配成功,后向引用,引用的就是匹配成功后的内容,引用的是结果,而不是表达式。54

55 因此,(\d{1,3})(.\1){3}这个表达式实际上匹配的是四个数都相同的IP地址,比如:123.123.123.123。56

57

58

59 至此,读者已经掌握了传说中的后向引用,就这么简单。

对于分组的理解

分组命名:语法(?p)注意先命名,后正则

importreimportre

ret=re.search('\w+','

hello

')print(ret.group())#给分组起个名字。就用下面的分组命名,上面的方法和下面的分组命名是一样的,只不过就是给命了个名字

ret=re.search('\w+)>\w+(?P=tag_name)>','

hello

')#(?P=tag_name)就代表的是(\w+)

print(ret.group())#了解(和上面的是一样的,是上面方式的那种简写)

ret=re.search(r'\w+\1>','

hello

')print(ret.group(1))

转义符:

023589bc2e14aae2983ad85349f1c332.png

四、re模块

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 #1.re模块下的常用方法

2 #1.findall方法

3 importre4 ret = re.findall('a','eva ang egons')5 ##返回所有满足匹配条件的结果,放在列表里

6 print(ret)7

8 #2.search方法

9 #函数会在字符串中查找模式匹配,只会找到第一个匹配然后返回

10 #一个包含匹配信息的对象,该对象通过调用group()方法得到匹配的

11 #字符串,如果字符串没有匹配,则报错

12 ret = re.search('s','eva ang egons')#找第一个

13 print(ret.group())14

15

16 #3.match方法

17 print(re.match('a','abc').group())18 #同search,只从字符串开始匹配,并且guoup才能找到

19

20

21 #4.split方法

22 print(re.split('[ab]','abcd'))23 #先按'a'分割得到''和'bcd',在对''和'bcd'分别按'b'分割

24

25

26 #5.sub方法

27 print(re.sub('\d','H','eva3sdf4ahi4asd45',1))28 #将数字替换成'H',参数1表示只替换一个

29

30

31 #6.subn方法

32 print(re.subn('\d','H','eva3sdf4ahi4asd45'))33 #将数字替换成’H‘,返回元组(替换的结果,替换了多少次)

34

35

36 #7.compile方法

37 obj = re.compile('\d{3}')#将正则表达式编译成一个正则表达式对象,规则要匹配的是三个数字

38 print(obj)39 ret = obj.search('abc12345eeeee')#正则表达式对象调用search,参数为待匹配的字符串

40 print(ret.group()) #.group一下就显示出结果了

41

42 #8.finditer方法

43 ret = re.finditer('\d','dsf546sfsc')#finditer返回的是一个存放匹配结果的迭代器

44 #print(ret)#

45 print(next(ret).group())#查看第一个结果

46 print(next(ret).group())#查看第二个结果

47 print([i.group() for i in ret] )#查看剩余的左右结果

re模块相关的方法

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 importre2 ret = re.findall('www.(baidu|oldboy).com','www.oldboy.com')3 print(ret) #结果是['oldboy']这是因为findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可

4

5 ret = re.findall('www.(?:baidu|oldboy).com','www.oldboy.com')6 print(ret) #['www.oldboy.com']

findall的优先级查询

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 ret = re.split('\d+','eva123dasda9dg')#按数字分割开了

2 print(ret) #输出结果:['eva', 'dasda', 'dg']

3

4 ret = re.split('(\d+)','eva123dasda9dg')5 print(ret) #输出结果:['eva', '123', 'dasda', '9', 'dg']

6 #

7 #在匹配部分加上()之后和不加括号切出的结果是不同的,

8 #没有括号的没有保留所匹配的项,但是有括号的却能够保留了

9 #匹配的项,这个在某些需要保留匹配部分的使用过程是非常重要的

split的优先级查询

re模块和正则表达式的关系:

re模块和正则表达式没有一点毛线关系。re模块和正则表达式的关系类似于time模块和时间的关系,你没有学习python之前,也不知道有一个time模块,但是你已经认识时间了呀,12:30就表示中午十二点半。时间有自己的格式,年月日时分秒,已成为一种规则。你早就牢记于心了,time模块只不过是python提供给我们的可以方便我们操作时间的一个工具而已。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于计算机专业的学生而言,参加各类比赛能够带来多方面的益处,具体包括但不限于以下几点: 技能提升: 参与比赛促使学生深入学习和掌握计算机领域的专业知识与技能,如编程语言、算法设计、软件工程、网络安全等。 比赛通常涉及实际问题的解决,有助于将理论知识应用于实践中,增强问题解决能力。 实践经验: 大多数比赛都要求参赛者设计并实现解决方案,这提供了宝贵的动手操作机会,有助于积累项目经验。 实践经验对于计算机专业的学生尤为重要,因为雇主往往更青睐有实际项目背景的候选人。 团队合作: 许多比赛鼓励团队协作,这有助于培养学生的团队精神、沟通技巧和领导能力。 团队合作还能促进学生之间的知识共享和思维碰撞,有助于形成更全面的解决方案。 职业发展: 获奖经历可以显著增强简历的吸引力,为求职或继续深造提供有力支持。 某些比赛可能直接与企业合作,提供实习、工作机会或奖学金,为学生的职业生涯打开更多门路。 网络拓展: 比赛是结识同行业人才的好机会,可以帮助学生建立行业联系,这对于未来的职业发展非常重要。 奖金与荣誉: 许多比赛提供奖金或奖品,这不仅能给予学生经济上的奖励,还能增强其成就感和自信心。 荣誉证书或奖状可以证明学生的成就,对个人品牌建设有积极作用。 创新与研究: 参加比赛可以激发学生的创新思维,推动科研项目的开展,有时甚至能促成学术论文的发表。 个人成长: 在准备和参加比赛的过程中,学生将面临压力与挑战,这有助于培养良好的心理素质和抗压能力。 自我挑战和克服困难的经历对个人成长有着深远的影响。 综上所述,参加计算机领域的比赛对于学生来说是一个全面发展的平台,不仅可以提升专业技能,还能增强团队协作、沟通、解决问题的能力,并为未来的职业生涯奠定坚实的基础。
对于计算机专业的学生而言,参加各类比赛能够带来多方面的益处,具体包括但不限于以下几点: 技能提升: 参与比赛促使学生深入学习和掌握计算机领域的专业知识与技能,如编程语言、算法设计、软件工程、网络安全等。 比赛通常涉及实际问题的解决,有助于将理论知识应用于实践中,增强问题解决能力。 实践经验: 大多数比赛都要求参赛者设计并实现解决方案,这提供了宝贵的动手操作机会,有助于积累项目经验。 实践经验对于计算机专业的学生尤为重要,因为雇主往往更青睐有实际项目背景的候选人。 团队合作: 许多比赛鼓励团队协作,这有助于培养学生的团队精神、沟通技巧和领导能力。 团队合作还能促进学生之间的知识共享和思维碰撞,有助于形成更全面的解决方案。 职业发展: 获奖经历可以显著增强简历的吸引力,为求职或继续深造提供有力支持。 某些比赛可能直接与企业合作,提供实习、工作机会或奖学金,为学生的职业生涯打开更多门路。 网络拓展: 比赛是结识同行业人才的好机会,可以帮助学生建立行业联系,这对于未来的职业发展非常重要。 奖金与荣誉: 许多比赛提供奖金或奖品,这不仅能给予学生经济上的奖励,还能增强其成就感和自信心。 荣誉证书或奖状可以证明学生的成就,对个人品牌建设有积极作用。 创新与研究: 参加比赛可以激发学生的创新思维,推动科研项目的开展,有时甚至能促成学术论文的发表。 个人成长: 在准备和参加比赛的过程中,学生将面临压力与挑战,这有助于培养良好的心理素质和抗压能力。 自我挑战和克服困难的经历对个人成长有着深远的影响。 综上所述,参加计算机领域的比赛对于学生来说是一个全面发展的平台,不仅可以提升专业技能,还能增强团队协作、沟通、解决问题的能力,并为未来的职业生涯奠定坚实的基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值