python基础9-re模块/logging模块/hashlib模块
-
re模块
- 字符串.find是完全匹配,做不到模糊匹配,正则可以做到模糊匹配(管理身份证信息)
- RE是小型的,高度专业化的编程语言,就是处理字符串,在其他语言中也可以引用正则表达式,引擎是c编写的,因此效率非常高
- re包括元字符,和6个方法
- 元字符:. ^ $ * + ? {} [] | () \
- . 是通配符,可以代替所有的字符,除了\n不行。re.findall("a..x", "asdfkljlkxdf"),一个 . 代表一个字符
- 尖角号^ 是位于开头,re.findll("^a..x", "sadfasdf"),检测后边数据中是否存在a开头的对应字符串
- re.findall("a..x$", "sadfasldjf"),检测是否存在以ax结尾的字符串,把匹配结果放到列表中。
- 四个重复符,都是贪婪匹配,都是尽可能匹配。加?变为惰性匹配
-
re.findall("alex*", "asdfale"),匹配成功,因为*是0到正无穷个
-
re.findall("alex+","sdafale"),匹配失败,因为+是1到正无穷
-
re.findall("alex?","sadfalexxxx"),结果为alex,即匹配0个或1个x,如果后边只是ale,即返回ale
- {}能表示前边所有的情况,{0, }等价于*, {1, }等价于+, {0,1}等价于?
- 字符集[]
- re.findall("x[y,z]p", "xypuuuxzpux,pu"),[]中取一个,起‘或’的作用
- 在字符集[]中没有特殊符号,*就是*
- [a-z],是取a到z中任意一个,横杠在字符集中‘范围’的意思
- q.[^a-z],^在字符集中是‘非’的意思,只要不是就能匹配。提取最底层的括号: re.findall("\([^()]*\)","12+(34*6+2-5*(2-1))"
- 反斜杠\在字符集中用于,恢复(等符号在字符集中括号的作用。
- 反斜杠\,叫转义符
- 反斜杠后边跟元字符去除特殊功能,比如\.
- 反斜杠后边跟普通字符实现特殊功能,比如\d
\w 匹配字母或数字或下划线或汉字 \s 匹配任意的空白符。\S非空白 \d 匹配任何十进制数字,相当于类[0-9]。\D是相反作用,匹配所有非数字字符。 \b 匹配单词的开始或结束,特殊字符边界,如空格,&,#等,即\b等于这些特殊字符
- \b的说明。
- re.findall(r"I\b","I am xxx"),如果不加r,python解释器会将处理\b的结果传给re模块,加上r则表示该字符串不需要处理,直接传给re
- 或者"I\\b",因为\在python中有特殊含义,\\表示去除其特殊含义
- re.findall("c\\\\|"),想匹配c\|。因为\在re模块有特殊意义,所以向\\去除特殊意义,向re传c\\|。为实现目标,在python中需要\\\\才能向re模块传入2个\\
- 管道符|
- r"ka|b",是ka或b的意思
- 分组()
- r."(abc)+",将abc作为整组进行匹配
- re.search("\d+", "asdjkhf34kjs76").group(),只返回34,即search只返回一个结果即可,返回的是一个对象
- re.search("(?P<name>[a-z]+)\d+","alex36wusir34"),将alex取出,并命名为name的对象,格式就是?P<>,分组用的。用在url路径匹配时
- re.match("\d+", "56alex36wushis34")返回56,功能与search相同,但仅在字符串开始处匹配,.group()取出对象
- re.split("[ab]","abc"),先按a分为 空 和 bc,空不能按b分,bc再按b分为 空 和 c,所以结果是 空 空 c
- re.sub("\d","A","jask2353sdhfjk233",4),将前4个数字替换成A。不加参数4的情况下,全部替换为A
- re.subn,将元素匹配成元组
-
com = re.comile("\d+")#将待匹配方法写到此处 com.findall("fijksad23sdf234sdkj4")#原字符串 #功能与findall相同,但可以用多次
-
ret = re.finditer("\d","sdfjh8977ksjdfkj98989")#将匹配内容作为迭代器 next(ret).group#取出迭代对象
- re.findall("www\.(?:baidu|163)\.com", "sdafhjwww.baidu.comsdkjfl"),findall优先将()中的内容拿出来。?:去优先级,返回网站全部
- 同上,re.findall("(abc)+", "abcabcabc"),只输出一个abc,即优先把组里的内容打印出来。re.findall("(?:abc)+","abcabcabc"),去掉优先级,打印出abcabcabc
-
logging模块
- 自己写日志,可以通过文件操作来完成
- 日志级别。debug, Info, warning, error, critical,级别逐渐升高
- logging.info或者.debug等方式调用日志信息
-
import logging logging.basicConfig( level = logging.DEBUG#将日志级别调整为debug filename = 'logger.log'#将日志写入此名字的文件,默认采用追加模式。 filemode = 'w'#
format="%(asctime)s %(filename)s",#将日志按照format的格式输出 ) logging.debug('hello')#输出日志内容,在调试阶段,要看到所有信息 logging.info() logging.warning()#在上线阶段,只看warning级别之上,提高效率 logging.error() logging.critical() - stream:流的方式即写到终端上,加了firename后写到文件中。屏幕和文件只能选择一个显示
- format参数中可能会用到的格式化串
- logger对象
- 跟吸心大法特别像
-
def logger():
import logginglogger=logging.getLogger()#创建一个吸心大法的低手。
#()中无内容,则是root根用户,如有内容,则是root下的子用户。
logger.setLevel("DEBUG")#设置logger的级别,debug就全部显示 fh=logging.FileHandler(test_log)#创建一个向文件test_log发送内容的高手 ch=logging.StreamHandler()#创建一个向屏幕发送内容的高手。如果注释掉,则不在屏幕显示,程序正常运行
fm=logging.Formatter("%(asctime)s %(message)s")#定义输出格式
fh.setFormatter(fm)#fh应用这种输出格式
ch.setFormatter(fm)#如果注释掉,则按照默认格式显示
logger.addHandler(fh)#学第一个技能 logger.addHandler(ch)#学第二个技能
return logger
#然后用学会了吸心大法的人打印信息,向屏幕打印,同时向文件输出
logger=logger()#调用logger函数
logger.debug("debug")
logger.info("info")
logger.warning("warning")
logger.error("error")
logger.critical("critical") -
如果在root下创建两个"my logger"的子用户,其实是一个,后边覆盖前边
- 一个日志py文件中,有父子两个logger,则打印子logger时,有几个上层在工作或者在输出,就重复打印几次,此举例中打印2次
-
configparser模块,配置解析模块
- 为配置文件开发的,对配置文件进行操作
-
#配置文件基本格式,包括三部分,三个大key和value,大key的每个value又包括key和value [DEFAULT]#默认信息,在遍历其他信息时,都会输出这部分。default默认在其他key中也存在 ServeAliveInterval=45#键值对 Compression=yes CompressionLevel=9 ForwardX11=yes [bitbucker.org]#另外一个键 User=hg
ServeAliveInterval=45#default这部分默认存在 Compression=yes CompressionLevel=9 ForwardX11=yes
[topsecret.server.com] #另外一个键
Port=5022 ForwardX11=no -
#通过类字典操作来生成配置文件 import configparser config=configparser.ConfigParser() #调用configparser类实例化出来一个对象。就相当于有个空字典config
with open('example.ini','w') as f:#将文件命名为f
config.write(f)#调用config的write方法,将配置写入文件中,与传统的f.write不同 -
config.get('bitbucket.org','compression'),是连续在两个key中取值,而字典的get第一个值是key,第二个值是没有key时的返回值
-
最后写完配置文件,config.write(open('i.cfg','w')),将配置信息写入新文件i.cfg中。这种文件打开方式,不是fopen,不用关闭
-
hashlib模块,哈希模块
- 摘要算法
- 把一个不定长的内容,转化成定长的内容
import hashlib obj=hashlib.md5("asdfhas".encode('utf-8'))#调用md5算法,给md5加盐,自己定义的 obj.update("hello".encode("utf8"))#将字符串写成字节 print(obj.hexdigest())#打印加密
obj.update("root".encode("utf8"))#root是在hello基础上加密的 -
一段字符串转成一个密文,且不能反解。
- 只能全部变成密文后比较
- 一般有sh256就可以了,要不断更新,没有一劳永逸的解
-
模块补充
- 多个py文件嵌套,路径搜索永远是执行文件的路径。
- print(lhg.cal.add(1,2)),当前文件bin.py调用lhf.py, lhf.py调用cal.py中的add函数