Python之模块(三 )

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 匹配任何空白字符;相当于[\t\n\r\f\v]
54 \S 匹配任何非空白字符;相当于[^\t\n\r\f\v]
55 \w 匹配任何字母数字字符;相当于[a-zA-Z0-9]
56 \W 匹配任何非字母数字字符;相当于[^a-zA-Z0-9]
57 \b 匹配一个特殊字符边界,如空格,&,#等
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\b","hello I am LIST")  # r 原生字符,python解析器中"I\b"不做任何转义,直接传给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","abc\glerwt")  # \\去掉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']
View Code

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
View Code

 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 '''
View Code
# =================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")
View Code

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"))
View Code

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

猜你喜欢

转载自www.cnblogs.com/kaixindexiaocao/p/9822924.html