re 模块
就其本质而言,正则表达式(或RE)是一种小型的,高度专业化的编程语言,(在python中)它内嵌在python在,并通过re模块实现。
正则表达式模块被编译成一系列的字节码,然后由用C编写的匹配引擎执行。
正则就是是对字符串处理。
字符匹配(普通字符,元字符):
1. 普通字符,大多数字符和字母都会和自身匹配
>>>re.findall("alvin","yuanaleSxalvinwupeiqi")
["alvin"]
2. 元字符: .^$*+?{}[]|()
1 import re 2 3 #---------------元字符 . ^ $ * + ? {} 4 ret = re.findall('a..in',"helloassinsdfakjksjdfin") # .通配符 5 print(ret) #['assin'] 6 7 ret = re.findall("^a..in","assinhelloassinsdfakjkfin") # ^以什么开头 8 print(ret) #['assin'] 9 10 ret = re.findall("a..in$","assinhellosdfakjin") # $以什么结尾 11 print(ret) #['akjin'] 12 13 ret = re.findall("d*","abcdddddddefgh") # * 匹配0-无穷次的内容 贪婪匹配(尽可能多的匹配) 14 print(ret) #['', '', '', 'ddddddd', '', '', '', '', ''] 15 ret = re.findall("abcd*","abcefgh") 16 print(ret) #['ddddddd'] #['abc'] 17 18 ret = re.findall("d+","abcdddddddefgh") # + 匹配1-无穷次的内容 贪婪匹配 19 print(ret) #['ddddddd'] #['ddddddd'] 20 21 ret = re.findall("abcd?","abcdddddddefgh") # ? 匹配(0,1)次 贪婪匹配 22 print(ret) #['abcd'] 23 24 ret = re.findall("abcd{0,4}","abcdddddddefgh") # {a,b} 匹配{a---->b}次 (尽可能多的匹配) 25 print(ret) #['abcdddd'] 26 27 ret = re.findall("abcd*?","abcdddddddefgh") # 在 *,+,? 后面再加上?变成惰性匹配取最少的 28 print(ret) #['abc'] 29 30 #-------------------------元字符 [] 31 32 ret = re.findall("x[y,z]p","xypabcxzpdefx,p") #[] 以或的形式一一批配 33 print(ret) #['xyp', 'xzp', 'x,p'] 34 35 ret = re.findall("x[y*z]p","xyyyypabcxzpdefx,p") #[] 以或的形式一一批配* + ?在[]里没用 36 print(ret) #['xzp'] 37 38 #元字符[]里有特殊功能的符号 - ^ 39 ret = re.findall("q[a-z]*","qxypabcxzpdefx,q8") # - :[a-b] 以或的形式 批配在a--->b 内容 ASCII码中的顺序 40 print(ret) #['qxypabcxzpdefx', 'q'] 41 42 ret = re.findall("q[^a-z]*","qxypabcxzpdefx,q8") # ^ :[^a-b] 以或的形式 批配在a--->b 之外的内容 ASCII码中的顺序 43 print(ret) #['q', 'q8'] 44 45 #-----------------------元字符 46 47 ''' 48 反斜杠后面跟元字符去掉特殊功能如 如 . 49 反斜杠后面跟普通字符实现特殊功能 如 d 50 51 d 匹配任何十进制数;相当于[0-9] 52 D 匹配任何非数字字符;相当于[^0-9] 53 s 匹配任何空白字符;相当于[ fv] 54 S 匹配任何非空白字符;相当于[^ fv] 55 w 匹配任何字母数字字符;相当于[a-zA-Z0-9] 56 W 匹配任何非字母数字字符;相当于[^a-zA-Z0-9] 57 匹配一个特殊字符边界,如空格,&,#等 58 ''' 59 ret = re.findall("d","sdf21sdf545") 60 print(ret) #['2', '1', '5', '4', '5'] 61 ret = re.findall("D","sdf21sdf545") 62 print(ret) #['s', 'd', 'f', 's', 'd', 'f'] 63 ret = re.findall("s","hello word") 64 print(ret) #[' '] 65 ret = re.findall("S","hello word") 66 print(ret) #['h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'd'] 67 68 #---------------------转义字符 69 ret = re.findall(r"I","hello I am LIST") # r 原生字符,python解析器中"I"不做任何转义,直接传给re 70 print(ret) #['I'] 71 72 ret = re.findall("I\b","hello I am LIST") # \去掉python解析器中的特殊意义 73 print(ret) #['I'] 74 75 ret = re.findall("c\\g","abcglerwt") # \去掉python解析器中的特殊意义 --->在re中 得到"c\g",\去掉re中的特殊意义 76 print(ret) #['c\g'] \ ------> 77 78 79 #-----------------管道符 | 80 ret = re.findall("ka|bs","sdfkabsdf") # 或 81 print(ret) #['ka', 'bs'] 82 83 #--------------------- 分组() 84 ret = re.findall("(abc)+","abcabcabc") 85 print(ret) #['abc'] 86 ret = re.findall("(?:abc)+","abcabcabc") #取消优先级 87 print(ret) #['abcabcabc'] 88 89 # re.search返回的是一个对象 90 ret = re.search("(?P<name>[a-z]+)(?P<age>d+)","abc18def20") # ?P固定格式<name> 做了个分组,名字叫name 91 print(ret.group())#调用值用group #abc18 92 print(ret.group("name"))#abc 93 print(ret.group("age"))#18 94 95 #--------------取消优先级 ?: 96 ret = re.findall("www.(baidu|163).com","abcwww.baidu.comdef") 97 print(ret) #['baidu'] 98 ret = re.findall("www.(?:baidu|163).com","abcwww.baidu.comdef") 99 print(ret) #['www.baidu.com']
re 模块的方法:
1 import re 2 #------------------------re 模块的方法 3 4 ret = re.findall("a","abac") #返回所有满足条件的值放在一个列表里 5 print(ret) 6 7 ret = re.search("a","abac") #函数只找第一个匹配成功的然后返回一个对象 8 print(ret) #<_sre.SRE_Match object; span=(0, 1), match='a'> 9 print(ret.group()) #通过group 得到匹配的值 10 11 ret = re.match("a","babac") #同search,不过只在字符串开始处进行匹配 12 print(ret) #None 13 14 ret = re.split("[ab]","abcd") #按照[ab] 分割先按a 分割成'',bcd; bcd再按b分割 15 print(ret) #['', '', 'cd'] 16 17 18 ret = re.sub("d+","A","abc123abc123",1) #替换 最后一个参数匹配次数 19 print(ret) #abcAabc123 20 ret = re.subn("d+","A","abc123abc123",1) #替换 21 print(ret) #('abcAabc123', 1) 最后一个参数匹配次数 22 23 obj = re.compile("d+") #定义一个规则 24 ret = obj.findall("abc123abc123") 25 print(ret) #['123', '123'] 26 27 ret = re.finditer("d","a1a1a1a1a1a1") #返回所有满足条件的值放在一个迭代器里 28 print(ret) #<callable_iterator object at 0x0000016BAC4CADA0> 29 print(next(ret).group()) # 1
logging 模块
# =================logging.basicConfig()
1 import logging 2 3 logging.basicConfig( 4 level=logging.DEBUG, 5 filename="logger.log", 6 filemode="w", 7 format="%(asctime)s %(filename)s [%(lineno)d] %(message)s" 8 ) 9 10 logging.debug("debug message") 11 logging.info("info message") 12 logging.warning("warning message") 13 logging.error("error message") 14 logging.critical("critical message") 15 16 """logging.basicConfig()函数中的可用参数 17 filenema:用指定的文件名创建FileHandle,这样日志会被储存在指定文件中 18 filemode:文件打开方式,默认为“a” 19 format:指定handle使用的日志显示格式 20 datefmt:指定日期时间格式 21 level:设置rootlogger的日志级别 22 stream:指定stream创建StreamHandle。如果filename和stream两个参数同时列出,则stream参数会被忽略 23 24 """ 25 26 ''' format 参数可能用到的格式化串 27 %(name)s Logger的名字 28 %(levelno)s 数字形式的日志级别 29 %(levelname)s 文本形式的日志级别 30 %(pathname)s 调用日志输出函数模块的完整路径名 31 %(filename)s 调用日志输出函数的模块文件名 32 %(module)s 调用输出日志函数的模块名 33 %(funcName)s 调用日志输出函数的函数名 34 %(lineno)d 调用日志输出函数的语句所在的代码行 35 %(created)f 当前时间,用UNIX标准时间的浮点数表示 36 %(asctime)s 字符串形式的当前时间 37 %(message)s 用户输入的消息 38 '''
# =================logger
1 import logging 2 # =================logger 3 logger = logging.getLogger() 4 5 fh = logging.FileHandler("test_log") 6 ch = logging.StreamHandler() 7 8 fm = logging.Formatter("%(asctime)s %(message)s") 9 10 fh.setFormatter(fm) 11 ch.setFormatter(fm) 12 13 logger.addHandler(fh) 14 logger.addHandler(ch) 15 16 logger.setLevel("DEBUG") 17 #==================== 18 19 logger.debug("debug message") 20 logger.info("info message") 21 logger.warning("warning message") 22 logger.error("error message") 23 logger.critical("critical message")
configparser 模块
常见文档格式
[DEFAULT] serveraliveinterval = 45 forwardxll = yes compressionlevel = 9 compression = yes [bitbucket.org] user = hg [topsecret.server.com] host port = 50022 forwardxll = yes
生成一个这样的文档:
1 import configparser 2 3 config = configparser.ConfigParser() #-------->config=[] 4 config["DEFAULT"]={ 5 "ServerAliveInterval" : '45', 6 "Compression" : 'yes', 7 "CompressionLevel" : '9', 8 "ForwardXll" : 'yes' 9 } 10 11 config['bitbucket.org'] = {} 12 config["bitbucket.org"]['User']='hg' 13 config['topsecret.server.com']={} 14 topsecret = config['topsecret.server.com'] 15 topsecret["Host Port"] = "50022" 16 topsecret["ForwardXll"] = "yes" 17 18 with open('example.ini',"w") as f: 19 config.write(f) 20 21 #------------------------增删改查 22 import configparser 23 24 config = configparser.ConfigParser() 25 26 #----------查 27 print(config.sections()) #[] 28 config.read("example.ini") 29 print(config.sections()) #['bitbucket.org', 'topsecret.server.com'] 30 print(config["bitbucket.org"]["User"]) #hg 31 32 for key in config["bitbucket.org"]: 33 print(key) 34 """user 35 compressionlevel 36 serveraliveinterval 37 forwardxll 38 compression""" 39 40 print(config.options("bitbucket.org")) #['user', 'compressionlevel', 'serveraliveinterval', 'forwardxll', 'compression'] 41 print(config.items("bitbucket.org")) 42 #[('compressionlevel', '9'), ('serveraliveinterval', '45'), ('forwardxll', 'yes'), ('compression', 'yes'), ('user', 'hg')] 43 44 print(config.get("bitbucket.org","User")) #hg 45 46 #------------------------增,删,改 47 48 config.add_section("yuan") 49 config.set("yuan","k1","10") 50 51 config.remove_section("topsecret.server.com") 52 config.remove_option("bitbucket.org","User") 53 54 55 config.write(open("i.cfg","w"))
hashlib 模块
用于加密的相关操作: 主要提供SHA1,SHA224,SHA256,SHA384,SHA512,MD5算法,用法差不多
不能反解
1 import hashlib 2 3 obj=hashlib.md5() 4 5 obj.update("hello".encode("utf8")) 6 print(obj.hexdigest()) #5d41402abc4b2a76b9719d911017c592 7 8 obj.update("root".encode("utf8")) 9 print(obj.hexdigest()) #e206121dbbe984f3bc6c6448846ed8cd 10 11 md5=hashlib.md5() 12 md5.update("helloroot".encode("utf8")) 13 print(obj.hexdigest()) #e206121dbbe984f3bc6c6448846ed8cd 14 15 hash = hashlib.sha256("abc".encoding("utf8")) 16 hash.update("hello".encode("utf8")) 17 print(hash.hexdigest()) #2cb9c710242d0e384bb068a76a664a10f3970c7e81d58059378cfd5f5ba12b0f