python27期day17:re、logging日志模块、作业。
1、re:
正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法。或者说:正则就是用来描述一类事物的规则。(在Python中)它内嵌在Python中,并通过 re 模块实现。正则表达式模式被编译成一系列的字节码,然后由用 C 编写的匹配引擎执行。
2、findall 全部找到返回一个列表:
s = "alex,meet,eva_j"
import re
print(re.findall('e',s)) # 参数1:要查找的内容,参数2:从哪查找,3、返回结果是列表的形式
结果:['e', 'e', 'e', 'e']
3、\w 匹配中文,字母,数字,下划线:
import re
s = "alex1!,你哈t2,eva_j@!"
print(re.findall("\w",s)) # 匹配字母(包含中文)或数字或下划线 ***
结果:['a', 'l', 'e', 'x', '1', '你', '哈', 't', '2', 'e', 'v', 'a', '_', 'j']
4、\W 不匹配中文,字母,数字,下划线:
import re
s = "alex1!,你哈t2,eva_j@!"
print(re.findall("\W",s)) # 匹配非字母(包含中文)或数字或下划线 ***
结果:['!', ',', ',', '@', '!']
5、\s 匹配任意的空白符:
import re
s = " zhangda@, "
print(re.findall("\s",s)) # 匹配任意空白符
结果:[' ', ' ']
6、\S 匹配不是任意的空白符:
import re
s = " zhangda@, "
print(re.findall("\S",s)) # 匹配任意非空白符包含特殊符号 ***
结果:['z', 'h', 'a', 'n', 'g', 'd', 'a', '@', ',']
7、\d 匹配数字:
import re
s = " 123zhangda@, "
print(re.findall('\d',s)) # 匹配数字 ***
结果:['1', '2', '3']
8、\D 匹配非数字:
import re
s = " 123zhangda@, "
print(re.findall('\D',s))
结果:[' ', 'z', 'h', 'a', 'n', 'g', 'd', 'a', '@', ',', ' ']
9、从字符串开头匹配:
import re
s = "Adsasf"
print(re.findall("\AA",s)) #\A从字符串开头匹配、从字符串开头匹配没有就返回空列表
结果:['A']
10、^匹配字符串的开始:
import re
s = "Adsasf"
print(re.findall("^A",s)) # 匹配开头没有就返回空列表 ***
结果:['A']
11、\Z匹配字符串的结束,如果是换行,只匹配到换行前的结果:
import re
s = "Adsasf"
print(re.findall("f\Z",s))
结果:['f']
12、\$匹配字符串的结尾:
import re
s = "Adsasf"
print(re.findall("f$",s)) # 匹配结尾 ***
结果:['f']
13、.匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。
import re
s = "!@#$5%0,1,2AAAA,113,-4,5,-6,7,9alex_meet\n"
print(re.findall(".",s)) # 匹配任意字符串(换行和制表符除外) ***
结果:['!', '@', '#', '$', '5', '%', '0', ',', '1', ',', '2', 'A', 'A', 'A', 'A', ',', '1', '1', '3', ',', '-', '4', ',', '5', ',', '-', '6', ',', '7', ',', '9', 'a', 'l', 'e', 'x', '_', 'm', 'e', 'e', 't']
print(re.findall(".",s,re.DOTALL))
结果:['!', '@', '#', '$', '5', '%', '0', ',', '1', ',', '2', 'A', 'A', 'A', 'A', ',', '1', '1', '3', ',', '-', '4', ',', '5', ',', '-', '6', ',', '7', ',', '9', 'a', 'l', 'e', 'x', '_', 'm', 'e', 'e', 't', '\n']
14、[...]匹配字符组中的字符:
import re
s = "!@#$5%0,1,2AAAA,113,-4,5,-6,7,9alex_meet\n"
print(re.findall("[0-9a-zA-Z]",s)) # [数字0-数字9和字母a-z和A-Z]
结果:['5', '0', '1', '2', 'A', 'A', 'A', 'A', '1', '1', '3', '4', '5', '6', '7', '9', 'a', 'l', 'e', 'x', 'm', 'e', 'e', 't']
import re
s = "!@#$5%0,1,2AAAA,113,-4,5,-6,7,9alex_meet\n"
print(re.findall("[0-9]",s)) # [数字0-数字9]
结果:['5', '0', '1', '2', '1', '1', '3', '4', '5', '6', '7', '9']
15、*匹配0个或者多个左边的字符 贪婪匹配方式:
import re
s = "aleex1.!,你哈t2,eev11a_j@!1111"
print(re.findall("a*",s))
结果:['a', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'a', '', '', '', '', '', '', '', '', '']
16、+匹配一个或者多个左边的字符贪婪匹配方式:
import re
s = "aleex1.!,你哈t2,eev11a_j@!1111"
print(re.findall("a+",s))
结果:['a', 'a']
17、?匹配0个或者1个左边的字符,非贪婪方式:
import re
s = "aleex1.!,你哈t2,eev11a_j@!1111"
print(re.findall("a?",s))
结果:['a', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'a', '', '', '', '', '', '', '', '', '']
18、{n}精准匹配n个前面的表达式:
import re
s1 = "aleex1.!,你哈t2,eev11a_j@!1111"
print(re.findall("e{2}",s1)) # 精确
print(re.findall("ee",s1))
结果:['ee', 'ee']
19、{n,m}匹配n到m次由前面的正则表达式定义的片段,贪婪方式:
import re
s1 = "aleex1.!,你哈t2,eev11a_j@!1111"
print(re.findall('e{0,3}',s1)) # 范围
结果:['', '', 'ee', '', '', '', '', '', '', '', '', '', '', 'ee', '', '', '', '', '', '', '', '', '', '', '', '', '']
20、a|b 匹配a或者b:
import re
s1 = "alea121meeeeeeeet11123,wusir324"
print(re.findall("a|e",s1)) # 或
结果:['a', 'e', 'a', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'e']
21、() 匹配括号内的表达式,也表示一个组:
import re
s1 = "alea121meeeeeeeet11123,wusir324"
print(re.findall("e(e)e",s1)) # 分组
print(re.findall("m(eee)e",s1)) # 分组
print(re.findall("e(?:e)e",s1)) # 分组
结果: ['e', 'e']
['eee']
['eee', 'eee']
22、找到所有带_sb的内容:
s = 'alex_sb wusir_sb 的 alex wusir '
import re
print(re.findall("(.*)_sb",s))
print(re.findall("(.+?)_sb",s)) # .... * 0 or .... 1
print(re.findall("(.............)_sb",s))
结果: ['alex_sb wusir']
['alex', ' wusir']
['alex_sb wusir']
23、\d匹配数字:
import re
s1 = "1-2*(60+(-40.35/5)-(-4*3))"
print(re.findall("\d+",s1))
结果:['1', '2', '60', '40', '35', '5', '4', '3']
24、\. == 转义成普通的小数点:
import re
s1 = "1-2*(60+(-40.35/5)-(-4*3))"
print(re.findall("\d+\.\d+|\d+",s1))
结果:['1', '2', '60', '40.35', '5', '4', '3']
25、匹配所有的数字(包含小数包含负号):
print(re.findall("-\d+\.\d+|-\d+|\d+",s1))
结果:['1', '-2', '60', '-40.35', '5', '-4', '3']
26、匹配所有邮箱:
import re
s2 = "http://blog.csdn.net/make164492212@163.com/article/details/51656638" # 匹配所有邮箱
print(re.findall('\w+@\d+\.com',s2))
结果:['make164492212@163.com']
27、匹配qq号:腾讯从10000开始:
import re
s6 = "1231231,324233,123,1123,2435,1234,2546,23451324,3546354,13241234"
print(re.findall('\d{5,11}',s6))
结果:['1231231', '324233', '23451324', '3546354', '13241234']
28、search、match:
search ***** # 从字符串任意位置进行匹配,查找到一个就停止了
match ***** # 从字符串开始位置进行匹配,找不返回None
29、split分割:
import re
print(re.split('[ ::,;;,]','alex wusir,日天,太白;女神;肖锋:吴超'))
结果:['alex', 'wusir', '日天', '太白', '女神', '肖锋', '吴超']
30、sub替换:
import re
s = 'barry是最好的讲师,barry就是一个普通老师,请不要将barry当男神对待。'
print(re.sub('barry', 'meet',s))
结果:meet是最好的讲师,meet就是一个普通老师,请不要将meet当男神对待。
31、compile 定义匹配规则:
import re
obj = re.compile('\d{2}')
print(obj.findall("alex12345"))
结果:['12', '34']
32、给分组起名字:
import re
s = "<h1>hello</h1>"
print(re.findall("<(\w+)>",s))
结果:h1
33、logging模块:
logging -- 日志
1.记录程序运行状态
# 时间,那个文件,报错行数,错误信息
2.用户的喜好
# 分析用户的一些喜好,操作
3.银行
# 账户的一些流水
我们来说一下这个logging模块,这个模块的功能是记录我们软件的各种状态,你们现在和我一起找到红蜘蛛的那个图标,然后右键找一找是不是有个错误日志.其实每个软件都是有错误日志的,开发人员可以通过错误日志中的内容对他的程序进行修改
这只是一种应用场景,有的还会将日志用于交易记录.比如你给我转账应该做记录吧,
我们使用的信用卡,每消费的一笔都会记录,我们来看看这个日志怎么用?
我们先来看一下函数式简单配置
import logging
logging.debug('debug message')
logging.info('info message')
logging.warning('warning message')
logging.error('error message')
logging.critical('critical message')
默认情况下Python的logging模块将日志打印到了标准输出中,且只显示了大于等于WARNING级别的日志,这说明默认的日志级别设置为WARNING
(日志级别等级CRITICAL > ERROR > WARNING > INFO > DEBUG),
默认的日志格式为日志级别:Logger名称:用户输出消息。
我们自己用函数写的这个可以正常使用但是不够灵活,我们看看这个灵活的
灵活配置日志级别,日志格式,输出位置:
import logging
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
datefmt='%a, %d %b %Y %H:%M:%S',
filename='/tmp/test.log',
filemode='w')
logging.debug('debug message')
logging.info('info message')
logging.warning('warning message')
logging.error('error message')
logging.critical('critical message')
logging.debug("这是调试")
logging.info("这是信息")
logging.warning("这是警告")
logging.error("这是错误")
logging.critical("这是危险")
basicConfig()函数中可通过具体参数来更改logging模块默认行为,可用参数有:
- filename:用指定的文件名创建FiledHandler,这样日志会被存储在指定的文件中。
- filemode:文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w”。
- format:指定handler使用的日志显示格式。
- datefmt:指定日期时间格式。
- level:设置记录日志的级别
- stream:用指定的stream创建StreamHandler。可以指定输出到
- sys.stderr,sys.stdout或者文件(f=open(‘test.log’,’w’)),默认为sys.stderr。若同时列出了filename和stream两个参数,则stream参数会被忽略。
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用户输出的消息
logger对象配置
import logging
logger = logging.getLogger()
# 创建一个handler,用于写入日志文件
fh = logging.FileHandler('test.log',encoding='utf-8')
# 再创建一个handler,用于输出到控制台
ch = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setLevel(logging.DEBUG)
fh.setFormatter(formatter)
ch.setFormatter(formatter)
logger.addHandler(fh) #logger对象可以添加多个fh和ch对象
logger.addHandler(ch)
logger.debug('logger debug message')
logger.info('logger info message')
logger.warning('logger warning message')
logger.error('logger error message')
logger.critical('logger critical message')
logging库提供了多个组件:Logger、Handler、Filter、Formatter。Logger对象提供应用程序可直接使用的接口,Handler发送日志到适当的目的地,Filter提供了过滤日志信息的方法,Formatter指定日志显示格式。另外,可以通过:logger.setLevel(logging.Debug)设置级别,当然,也可以通过
fh.setLevel(logging.Debug)单对文件流设置某个级别。
import logging
looger = logging.getLogger() # 创建一个空架子
fh = logging.FileHandler('test1.log',mode="a",encoding="utf-8")
# 创建一个文件句柄,用来记录日志(文件流)
ch = logging.StreamHandler()
# 创建一个屏幕流,打印记录的内容
f_str = logging.Formatter("%(asctime)s %(name)s %(levelname)s %(filename)s %(lineno)s %(message)s")
# 定义一个记录日志的格式
looger.level = 10
# 设置一个记录级别
fh.setFormatter(f_str) # 给文件句柄设置记录内容的格式
ch.setFormatter(f_str) # 给中控台设置打印内容的格式
looger.addHandler(fh) # 将文件句柄添加的looger对象中
looger.addHandler(ch) # 将中控台添加的looger对象中
looger.debug(1234) # 咱们二次开发实现的
looger.info(1234) # 咱们二次开发实现的
looger.warning(1234) # 咱们二次开发实现的
looger.error(1234) # 咱们二次开发实现的
looger.critical(1234) # 咱们二次开发实现的
"""
# logging.debug() # 人家自带的
python27期day17:re、logging日志模块、作业。的更多相关文章
- logging 日志模块学习
logging 日志模块,用于记录系统在运行过程中的一些关键信息,以便于对系统的运行状况进行跟踪,所以还是灰常重要滴,下面我就来从入门到放弃的系统学习一下日志既可以在屏幕上显示,又可以在文件中体现. ...
- logging日志模块
为什么要做日志: 审计跟踪:但错误发生时,你需要清除知道该如何处理,通过对日志跟踪,你可以获取该错误发生的具体环境,你需要确切知道什么是什么引起该错误,什么对该错误不会造成影响. 跟踪应用的警告和错误 ...
- python 自动化之路 logging日志模块
logging 日志模块 http://python.usyiyi.cn/python_278/library/logging.html 中文官方http://blog.csdn.net/zyz511 ...
- day31 logging 日志模块
# logging 日志模块 ****** # 记录用户行为或者代码执行过程 # print 来回注释比较麻烦的 # logging # 我能够“一键”控制 # 排错的时候需要打印很多细节来帮助我排错 ...
- logging日志模块的使用
logging日志模块的使用 logging模块中有5个日志级别: debug 10 info 20 warning 30 error 40 critical 50 通常使用日志模块,是用字典进行配置 ...
- Python入门之logging日志模块以及多进程日志
本篇文章主要对 python logging 的介绍加深理解.更主要是 讨论在多进程环境下如何使用logging 来输出日志, 如何安全地切分日志文件. 1. logging日志模块介绍 python ...
- Python 中 logging 日志模块在多进程环境下的使用
因为我的个人网站 restran.net 已经启用,博客园的内容已经不再更新.请访问我的个人网站获取这篇文章的最新内容,Python 中 logging 日志模块在多进程环境下的使用 使用 Pytho ...
- Python logging(日志)模块
python日志模块 内容简介 1.日志相关概念 2.logging模块简介 3.logging模块函数使用 4.logging模块日志流处理流程 5.logging模块组件使用 6.logging配 ...
- 约束、自定义异常、hashlib模块、logging日志模块
一.约束(重要***) 1.首先我们来说一下java和c#中的一些知识,学过java的人应该知道,java中除了有类和对象之外,还有接口类型,java规定,接口中不允许在方法内部写代码,只能约束继承它 ...
- pyhton——logging日志模块的学习
https://www.cnblogs.com/yyds/p/6901864.html 本节内容 日志相关概念 logging模块简介 使用logging提供的模块级别的函数记录日志 logging模 ...
随机推荐
- Aug.2019_Memory
转眼间这半个月的时光已经过去了,现在就像妈说的,生活又要回归正常了.尽管我一直不愿意去承认说前半个月的时光是一种不正常的生活,但有一点是我无法否认的,那就是那些人和那些事所带给我的…… 想想最初自己也 ...
- springcloud源码分析(一)之采用redis实现注册中心
注册中心 在分布式架构中注册中心起到了管理各种服务功能包括服务的注册.发现.熔断.负载.降级等功能,在分布式架构中起到了不可替代的作用.常见的注册中心有eureka,zookeeper等等,在spri ...
- Ubuntu命令行打开新终端并执行脚本
gnome-terminal -x bash -c "bash test.sh;exec bash;"
- [转]python 中的[:-1]和[::-1]
转自:https://blog.csdn.net/mingyuli/article/details/81604795 1.案例解释a='python'b=a[::-1]print(b) #nohtyp ...
- 下载代码的时候 SSH与http的区别
SSH: git@gitlab.alibaba-inc.com:damai-mz/mz-market.git HTTP:http://gitlab.alibaba-inc.com/damai-mz/m ...
- (四十二)golang--协程之间通信的方式
假设我们现在有这么一个需求: 计算1-200之间各个数的阶乘,并将每个结果保存在mao中,最终显示出来,要求使用goroutime. 分析: (1)使用goroutime完成,效率高,但是会出现并发/ ...
- 论文阅读: v-charge项目: 电动车的自动泊车和充电
Abstract AVP服务会缓和电动车现有两个缺点: 有限的行驶范围和很长的充电时间. v-charge用相机和超声波在GPS-denied的区域全自动形式. 这篇paper叙述了下述几方面的优势: ...
- LeetCode 155:最小栈 Min Stack
LeetCode 155:最小栈 Min Stack 设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈. push(x) -- 将元素 x 推入栈中. pop() -- ...
- LeetCode28——实现strStr()
6月中下旬辞职在家,7 月份无聊的度过了一个月.8 月份开始和朋友两个人写项目,一个后台和一个 APP ,APP 需要对接蓝牙打印机.APP 和蓝牙打印机都没有搞过,开始打算使用 MUI 开发 APP ...
- Spring AOP中使用@Aspect注解 面向切面实现日志横切功能详解
引言: AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的一 ...