python学习第五天回顾(模块与包,正则表达式)
| 一、模块 |
#使用模块的好处:
@最大的好处是大大提高了代码的可维护性。
@编写代码不必从零开始。当一个模块编写完毕,就可以被其他地方引用。
@使用模块还可以避免函数名和变量名冲突。(相同名字的函数和变量完全可以分别存在不同的模块中,但需要注意的是尽量不要与内置函数名字冲突。)
1 #import 用来导入模块的 2 @生产新的名称空间 3 @以新建的名称空间为全局名称空间,执行文件的代码 4 @拿到一个模块名spam,指向spam.py产生的名称空间 5 #示例: 6 #spam.py 7 #!/usr/bin/env python 8 # -*- coding:utf-8 -*- 9 10 print("from the spam.py") 11 12 money = 1000 13 14 def read1(): 15 print("spam-->read1-->money",money) 16 17 def read2(): 18 print("spam-->read2 calling read") 19 read1() 20 def change(): 21 global money 22 money = 0#
1 # money=1000000000000000000000000000000000000000000 2 # print(spam.money) #打印spam中的money 3 # print(spam.read1) 4 # spam.read1() 5 # def read1(): 6 # print('from test.py') 7 # spam.read2() 8 9 # 10 # money=10 11 # spam.change() 12 # print(money)
#定义模块的别名:
1 #import spam as x 2 # print(x.money)
####导入模块中的函数
1 #from .... import .... 2 #1、产生新的名称空间 3 #2、以新建的名称空间为全局名称空间,执行文件的代码 4 #3、直接拿到spam.py产生的名称空间中的名字 5 #优点:方便,不用加前缀 6 #缺点:容易跟当前文件的名称空间冲突
1 from spam import money 2 # print(money) #spam模块内的money 3 # read1() 4 5 # money=10 6 # print(money) #本地文件的money
#from spam import * 相当于导入spam文件内的所有函数 #在要导入的文件中写__all__=["money","read1"]与from spam import * 相结合,表示导入spam中两个函数
1 #模块的搜索顺序: 2 # 内存-->内置-->sys.path 3 #查找导入模块的变量与函数时,先从内存中查找,在查找python内置的函数,然后在sys.path下面查找 4 #import sys 5 #print(sys.path) 这样可以查看python所在相关路径 6 7 #导入的文件不在同一目录下,需要用sys.path.append()将路径添加到环境变更中。
| 二、包 |
#如果不同的人编写的模块名相同怎么办?为了避免模块名冲突,python又引入了按目录来组织模块的方法,称为包
#使用包后,只要顶层的包名不与别人冲突,那所有模块都不会与别人冲突。
@包与模块之间,是用点隔开的,点的左边必须是包。
@每个包目录下面,都会有一个__init__.py的文件,这个文件必须存在,否则python就把该目录识别为普通目录,而不是一个包,__init__.py可以是空文件,也可以有python代码,因为__init__.py本身就是一个模块。
@在__init__.py内可以用__all__=[函数名,...]的形式,设定允许访问的函数
1 #可以在顶层的包中导入不同目录下的模块 2 #例如: 3 #from glance.api import policy,versions 4 #from glance.cmd import manage 5 #from glance.db import models
1 #导入包的过程中就执行包的内容
| 三、正则模块 |
#import re 导入re,正则模块
| \w | 匹配任何字母数字字符,与[A-Za-z0-9]功能相同,(\W与之相反) |
| \d | 匹配任何十进制数字,与[0-9]一致(\D与之相反),不匹配任何非数值型的数字 |
| \s | 匹配任何空格字符,与[\n\t\r\v\f]相同(\S与之相反) |
| \b | 匹配任何单词边界(\B与之相反) |
| \N | 匹配已保存的子组N(参见上面的(...)) |
| \c | 逐字匹配任何特殊字符c(即,仅按照字面意义匹配,不匹配特殊含义 |
| \A | 匹配字符串的起始(与^相同) |
| \Z | 匹配字符串的结束(与$相同) |
re.findall('\w','as213df_*|') re.findall('\W','as213df_*|')
print(re.findall('\d','a123bcdef')) print(re.findall('\D','a123bcdef'))
print(re.findall('\s','a b\nc\td')) print(re.findall('\S','a b\nc\td'))
print(re.findall("\bThe\b","The is a apple")) print(re.findall("\BThe\B","The is a apple"))
| literal | 匹配文本字符串的字面值literal |
| re1|re2 | 匹配正则表达式re1或者re2 |
| . | 匹配任何字符(除了\n之外) |
| ^ | 匹配字符串起始部分 |
| $ | 匹配字符串结束部分 |
| * | 匹配0或多次前面出现的正则表达式 |
| + | 匹配1或多次前面出现的正则表达式 |
| ? | 匹配0或1次前面出现的正则表达式 |
| {N} | 匹配N次前面出现的正则表达式 |
| {M,N} | 匹配M~N次前面出现的正则表达式 |
| [...] | 匹配来自字符集的任意单一字符 |
| [..x-y..] | 匹配x~y范围中的任意单一字符 |
| [^...] | 不匹配此字符集中出现的任何一个字符,包括某一范围的字符(如果在此字符集中出现) |
| (*|+|?|{})? | 用于匹配上面频繁出现/重复出现符号的非贪婪版本(*、+、?、{}) |
| (...) | 匹配封闭的正则表达式,然后另存为子组 |
print(re.findall('^h','hello egon hao123')) # print(re.findall('^h','ello egon hao123'))
print(re.findall('h','hello egon hao123'))
print(re.findall('a.c','abc a1c a*c a|c abd aed ac')) # print(re.findall('a.c','abc a1c a*c a|c abd aed a\nc',re.S)) #让点能够匹配到换行符
# print(re.findall('ab*','abbbbbb'))
# print(re.findall('ab+','abbbbbb'))
# print(re.findall('ab{3}','ab1 abbbbbbbb2 abbbbb3 ab4 ab122'))
# print(re.findall('ab{3,4}','ab1 abbb123 abbbb123 abbbbbt'))
print(re.findall('ab[123]','ab1 ab2 ab3 abc1')) print(re.findall('a[1,2\n]c','a2c a,c abc a1c a*c a|c abd aed a\nc'))
# print(re.findall('a[0-9a-zA-Z*-]c','a1c abc a*c a-c aEc'))
1 #.* 贪婪匹配 2 # print(re.findall('a.*c','ac abc aec a1c')) 3 4 #.*? 非贪婪匹配 5 # print(re.findall('a.*?c','ac abc aec a1c')) 6 # print(re.findall('a.*?c','ac abc a111111111c a\nc a1c',re.S))
1 #“?:” 用法 2 print(re.findall('compan(?:y|ies)', 3 'Too many companies have gone bankrupt, and the next one is my company')) 4 print(re.findall('ab+123','ababab123')) 5 print(re.findall('(?:ab)+123','ababab123'))
1 #原生字符串 2 # print(re.findall(r'a\\c','a\c')) #r代表告诉解释器使用rawstring,即原生字符串,把我们正则内的所有符号都当普通字符处理,不要转义 3 # print(re.findall('a\\\\c','a\c')) #同上面的意思一样,和上面的结果一样都是['a\\c']
re.search()的用法:
#re.search()将字符串的所有字符尝试与正则表达式匹配到第一个就不在继续匹配,返回matchobject会存放到group()中,若没有匹配到,则返回为None
1 print(re.search("c","abcdecb")) 2 返回结果为: 3 <_sre.SRE_Match object; span=(2, 3), match='c'> #表式返回的为match object,在字符串的(2,3)的位置,查找的对象为“c”
1 #调用group()方法,将search()匹配到的值显示出来 2 print(re.search("bc","abcdecb").group()) 3 返回结果为: 4 bc
1 正则表达式将同时查找c和a,当在字符串中区配到其中一个条件时则停止匹配,并返回结果。 2 print(re.search("c|a","this a map,count").group()) 3 返回结果为: 4 a
1 findall是匹配字符串的所有的,当有匹配成功后,还会继续匹配后面的字符串 2 print(re.findall("(?:c)","abcdecb")) 3 返回结果为: 4 ['c', 'c']
re.match() #只有在0位置匹配成功的话才有返回,如果不是开始位置匹配成功的话,match()就返回none。
1 print(re.match("a","abcdecb").group()) 2 返回结果为: 3 a 4 print(re.match("c","abcdecb").group()) 5 返回结果为: 6 None
re.sub()#替换函数
#re.sub(pattern,repl,string,count,flags)
1 首字母h大写 2 print(re.sub("^h","H","hello this is a world"))
1 将小写转为大写 2 print(re.sub("h","H","hello this is a world"))
1 #转换字符串中的内容做位置调换以空格为分隔 2 print(re.sub('^(\w+)(\s)(\w+)(\s)(\w+)(\s)(\w+)(\s)(\w+)',r'\9\2\3\4\5\6\7\8\1','hello this is a world')) 3 #转换字符串中的内容做位置调换以多个空格为分隔 4 print(re.sub('^(\w+)(\s+)(\w+)(\s+)(\w+)(\s+)(\w+)(\s+)(\w+)',r'\9\2\3\4\5\6\7\8\1','hello this is a world')) 5 #转换字符串中的内容做位置调换以多个特殊符号为分隔 6 print(re.sub('^(\w+)(\W+)(\w+)(\W+)(\w+)(\W+)(\w+)(\W+)(\w+)', r'\9\2\3\4\5\6\7\8\1', 'hello "\ + = this ----/== is --- /== a ---- /== world'))
1 #匹配字符串内的数字 2 print(re.findall(r'\-?\d+\.?\d*',"1-12*(60+(-40.35/5)-(-4*3))")) 3 #匹配字符串内的小数 4 print(re.findall(r'\-?\d+\.\d*',"1-2*(60+(-40.35/5.3+1.2)-(-4*3))")) 5 6 #匹配字符串内的整数 7 print(re.findall(r'\-?\d+\.\d+|(\-?\d+)',"1-2*(60+(-40.35/5.3+1.2)-(-4*3))"))

浙公网安备 33010602011771号