python学习篇之【re、logging、configparser】模块
一、re模块
正则表达式(或 RE)是一种小型的、高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现。正则表达式模式被编译成一系列的字节码,然后由用 C 编写的匹配引擎执行。
# 字符匹配(普通字符,元字符) # 1、普通字符 # 大多数字符和字母都会和自身匹配 re.findall(匹配规则,匹配内容) # 2、元字符 ''' 1 . 通配符,除了换行符其他都能匹配上 2 ^ 从字符串开头做匹配 3 $ 从字符串结尾做匹配 贪婪匹配:也就是尽可能的匹配。 惰性匹配:在贪婪匹配后面加上问号 如 *? 按最小的次数去匹配 4 * 匹配 0次 到 无穷次 5 + 匹配 1次 到 无穷次 6 ? 匹配 0 到 1 7 { } 自定义匹配次数{6}匹配6次、{0,6}匹配 0到6次、{0,}匹配0到无穷次 8 [ ] 类 | ( ) \
1、 . 通配符 除了换行符\n 其他的都能匹配上 string = 'aljackrainfinegay' print(re.findall('a..j',string)) 每个点 代表一个任意字符 2、 ^ 只匹配字符串开头 string = 'aljackrainfinegay' print(re.findall('^j..k',string)) 3、 $ 只匹配字符串结尾 string = 'aljackrainfinegay' print(re.findall('g.y$',string)) 4 、关于重复匹配的特殊字符 * ? + { } 一共四个特殊符号 (贪婪匹配) a、 * 匹配前一个,字符 0 到 无穷次。(0,00) string = 'aljaccccccckrainfinegay' print(re.findall('jai*',string)) print(re.findall('jac*',string)) b、 + 匹配前一个字符 1 到 无穷次 string = 'aljaccccccckrainfinegay' print(re.findall('jac+',string)) print(re.findall('jai+',string)) c、 ? 匹配前一个字符 0 到 1 次 string = 'aljacccccccckrainfinegay' print(re.findall('jac?',string)) d 、{}匹配前一个字符 自定义匹配次数 string = 'aljacccccccckrainfinegay' print(re.findall('jac{0,3}',string)) # 匹配 0 到 3次 print(re.findall('jac{0}',string)) # 匹配 0 次 返回 'ja' print(re.findall('jac{0,}',string)) # 无限次 5 [ ] 字符集 或的功能 在字符集里有功能的符号:- ^ \ # a-z 等于 a到z 的所有小写字母 A-Z # ^ 尖角号 为不包含 例:[^123] 不包含 1 或 2 或 3 # \ 元字符功能 string = 'alqwfuckgay1Y2m3d4X' # print(re.findall('a[abcdl]',string)) # 匹配 a 与 abcdl 的所有组合 # print(re.findall('a[a-z]',string)) # 匹配 a 与 a-z的所有组合 # print(re.findall('[a-z]1',string)) # 匹配a-z与1 组合的所有字符 # print(re.findall('[\d]',string)) # 匹配0 - 9 的所有字符 # print(re.findall('[^0-9]',string)) # 匹配不包括 0-9 的所有字符 # 实例:拿出()最里层的 3+4 # 思路: 以 ( 开始,以 ) 结尾,且中间没有() 。使用 * 匹配里面的内容 string = '7+2*(5*(1*(3+4)))' print(re.findall('\([^()]*\)',string)) 6、 \ 元字符之转义字符 反斜杠后面跟元字符,去除特殊功能,如:\* 反斜杠后面跟普通字符,实现特殊功能,如:\d (1): \d 匹配任何十进制数,相当于 类 [0-9] string = '7+2*(52*(1*(33+4)))' print(re.findall('\d',string)) # 单个数字拿出 print(re.findall('\d+',string)) # 每次匹配 \d 至少为1个或多个数字 print(re.findall('\d*',string)) # 每次匹配 \d 至少为0个或多个数字,所以会给符号当空给匹配出来 (2): \D 匹配任何非十进制数,相当于 字符集 [^0-9 ] string = '7+2*(52*(1*(33+4)))' print(re.findall('\D',string)) #匹配出该字符串中所有非数字的字符 (3): \s 匹配任何空白字符,相当于 字符集 [\r\n\t\f\v] (4): \S 匹配任何非空白字符,相当于 字符集 [^\r\n\t\f\v] (5): \w 匹配任何字母、数字字符,相当于 字符集[a-zA-Z0-9] string = '1C!D2d@cv#4$5%6^7&8*b9d*A' print(re.findall('\w',string)) (6): \W 匹配任何非字母,数字字符,相当于 字符集[^a-zA-Z0-9] string = '1C!D2d@cv#4$5%6^7&8*b9d*A' print(re.findall('\W',string)) (7): \b 匹配一个特殊字符边界 比如: # & 空格等 string1 = 'i im strongman' string2 = 'hello i im strongman' # 拿出字符串中的所有 i print(re.findall('i',string1)) # 拿出 只有 前后为空格的 i # 因为\b 在python解释器里 转义的意义,而在re模块中\b又有其他意义 # 所以,可以在字符串前面加 r 来不使用python解释器的意义 # 第二种俺也不太理解,抽空查证 print(re.findall(r'i\b',string2)) print(re.findall('i\\b',string2)) (8) \\ string = 'abc\d\ef' # 要求 匹配出字符串中的 c\d print(re.findall('c\\\\d',string)) print(re.findall('c\\\d',string)) print(re.findall(r'c\\d',string)) # 前两个 \\的意思是 不使用python的转义,后两个就是把 就是\d 也不使用转义功能 # \\\ 也可以出来,只不过是python解释器内部给做的转化。返回值 为 ['c\\d'] # 因为找就是按照这样找的 ,所以返回 会多一个 \ 。 # 在匹配规则前加 r ,表示不采用python的转义功能,内部 \\ 表示 不使用\d的转义功能。 7 、() 元字符分组 配合 re.search() re.group()理解 string = 'abcabcabc' # (1)、要求,取出字符串中 的abc print(re.findall('(?:abc)',string)) # (2)使用re.search 与 re.group() 只取一个 re_search = re.search('(abc)',string) print(re_search) # 使用re.search 拿到的是一个对象 print(re_search.group()) # 对象.group()方法,拿出里面的值 # (3)、'(?P<tag>)' 标签写法 可用于url匹配 # 要求,拿出第一个人的姓名 name_tables = 'alex36wupeiqi34xuhaifeng33' print(re.search('(?P<name>[a-z]+)',name_tables).group()) # 要求,拿出第一个人的姓名、年龄,并可以使用group 通过定义的tag取值 user_info = re.search('(?P<name>[a-z]+)(?P<age>\d+)',name_tables) print(user_info.group('name')) print(user_info.group('age')) # 补充:()优先匹配机制 string1 = 'www.baidu.com' print(re.findall('www\.(baidu)\.com',string1)) # 返回值是 baidu print(re.findall('www\.(?:baidu)\.com',string1)) # 使用 ?:解除优先级 (?:) 拿出整数 ,包括负数 # ret=re.findall(r"\d+{0}]","1-2*(60+(-40.35/5)-(-4*3))") ret=re.findall(r"-?\d+\.\d*|(-?\d+)","1-2*(60+(-40.35/5)-(-4*3))") ret.remove("") print(ret) 8、 | 管道符 或的意思 string = 'babcdabc1' print(re.findall('ba|cd',string)) #返回['ba', 'cd'] re方法: re.findall re.finditer re.match re.sub re.subn ''' # * 与 + 的区别 # s = 'abdefghijklmnopqrstuvwxyz' # print(re.findall('abc*',s)) # print(re.findall('abc+',s)) # s = '122.78*344.1+22/11-1*3' # # 使用正则,取出 * / 挨着的两个数计算 # print(re.search(r'\d+\.?\d+[*/]\d+\.?\d+',s).group())
二、logging模块
1、简单应用
import logging logging.debug('debug message') logging.info('info message') logging.warning('warning message') logging.error('error message') logging.critical('critical message')
输出:
WARNING:root:warning message
ERROR:root:error message
CRITICAL:root:critical message
默认情况下Python的logging模块将日志打印到了标准输出中,且只显示了大于等于WARNING级别的日志,这说明默认的日志级别设置为WARNING(日志级别等级CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET),默认的日志格式为日志级别:Logger名称:用户输出消息。
2、灵活配置日志等级,日志格式,输出位置
logging.basicConfig( level = logging.DEBUG, # 日志报错等级 filename = 'logging_basecConfig.log', # 日志文件名 filemode= 'w', # 日志文件模式 format='%(lineno)d %(asctime)s %(filename)s %(levelname)s %(message)s', ) # # datafmt= #自定义时间 # # # 行号,时间,文件名,等级名,信息。 # logging.debug('hello debug') # logging.info('hello info') # logging.warning('hello warning') # logging.error('hello error') # logging.critical('hello critical')
format参数中可能用到的格式化串: %(name)s Logger的名字 %(levelno)s 数字形式的日志级别 %(levelname)s 文本形式的日志级别 %(pathname)s 调用日志输出函数的模块的完整路径名,可能没有 %(filename)s 调用日志输出函数的模块的文件名 %(module)s 调用日志输出函数的模块名 %(funcName)s 调用日志输出函数的函数名 %(lineno)d 调用日志输出函数的语句所在的代码行 %(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示 %(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数 %(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒 %(thread)d 线程ID。可能没有 %(threadName)s 线程名。可能没有 %(process)d 进程ID。可能没有 %(message)s用户输出的消息
3、logger对象
# 一共分为四步: # 1.创建logger对象 并设置logger输出级别。 # 2.写入日志文件与屏幕展示 # 3.使用logger对象 拿到logging操作后的内容 # 4.使用logging.Formatter 设置格式,再用logger对象的setFormatter方法应用自定义格式 logger = logging.getLogger() # 创建logger对象,即可使用getLoger下的方法 logger.setLevel('DEBUG') # 设置级别为 DEBUG FH = logging.FileHandler('logger_get.log') # 向日志文件发送内容 SH = logging.StreamHandler() # 日志页面展示 logger.addHandler(FH) # 使用自己定义的logger拿到日志内容 logger.addHandler(SH) # 使用自己定义的logger拿到展示 formatter = logging.Formatter('%(asctime)s % %(levelname)s %(message)s')# 定义格式 FH.setFormatter(formatter) # 格式应用于日志 SH.setFormatter(formatter) # 格式应用于显示 logger.debug('hello debug') logger.info('hello info') logger.warning('hello warning') logger.error('hello error') logger.critical('hello criticala')
三、configparser模块
对配置文件进行操作
import configparser # 使用ConfigParser()方法,把config变量变成一个 配置对象,与字典大致相同。 config = configparser.ConfigParser() # 配置方法:1 config['DEFAULT'] = {'localtion':'/c:/new'} # 等于创建了一个字典名,通过名字可以找到下面的配置 # 配置方法:2 config['user_info'] = {} config['user_info']['name'] = 'liuwen' config['user_info']['age'] = '30' config['user_info']['sex'] = 'ManAndWoman' # 配置方法:3 config['user_login'] = {} other_3 = config['user_login'] other_3['user_accunt'] = 'liuwen123' other_3['user_passwd'] = 'sbliuwen' # config.write(open('user_config.ini', 'w', encoding='utf8')) #这种方式写入,不用close # --------------------增删改查----------------------------- # 增 # 1、add_section 创建section名 # config.add_section('new_line') # 2、remove_section()、remove_option() # config.remove_section('user_login') # 删除section # config.remove_option('user_info','sex') # 删除option # 3、 set() 设置值,可以新建行信息,也可以更改 # config.set('new_line','k1','v1') # config.set('user_info','age','40') # config.write(open('user_config.ini','w',encoding='utf8')) # 查 # 1、sections()查看 配置组名称(字典名) 除了 DEFAULT 不显示 返回列表 # print(config.sections()) # 2 、read() 读取ini文件 # config.read('user_config.ini') # 3、 in 方法 # print('user_info' in config) # 配置文件里是不是有这个组名 返回布尔值 # 4、字典方式取值 查看user_info 下 name 的值。dict[key] # print(config['user_info']['name']) # 5、DEFAULT查看配置文件默认 配置组的值 # print(config['DEFAULT']['localtion']) # 6、循环打印 配置行的key # for key in config['user_info']: # print(key) # -----------------------------config对象下的方法----------------------------- # 1、options() 拿出默认组,与user_info组 的组名 返回列表 # print(config.options('user_info')) # 2、 items() 同字典功能的 item,(key,values),组下的每条 # print(config.items('user_info')) # 3、get() 获取 section 中option 的值,返回为string类型 # print(config.get('user_info','name')) # getint(section,option) 返回int类型 # getfloat(section, option) 返回float类型 # getboolean(section,option) 返回boolen类型

浙公网安备 33010602011771号