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类型

 

posted @ 2022-05-13 17:13  变靓  阅读(75)  评论(0)    收藏  举报