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、\A从字符串开头匹配:
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() # 人家自带的
import re
def TaskId(results):
global TaskId
regx = '.*"TaskId":(.*),"PlanId"'
pm = re.search(regx, results)
if pm:
TaskId = pm.group(1).encode('utf-8')
return TaskId
return False
if __name__ == '__main__':
results = '"TaskId":000123456,"PlanId"'
value = TaskId(results)
print(value.decode('utf-8'))
print('Done!')
结果:000123456
Done!
def GetToken(): # 取用户登录的 token 值
global token # 定义 token 全局变量
url = 'http://192.168.215.55/user/login.do' # 接口的 URL
params = {
'phone': '13798359580',
'pwd': '123456',
} # 参数为登录手机号和密码
request = urllib2.Request(url=url, data=urllib.urlencode(params)) # 发送接口# 请求 URL 和参数
response = urllib2.urlopen(request) # 返回响应数据
data = response.read()
regx = '.*"token":"(.*)","ud"' # 正则表达式 token,左匹配 "token":" 右匹配","ud"'
pm = re.search(regx, data) # 取 token 匹配值
token = pm.group(1) # 如果匹配到,则返回 token 值
return token
print(GetToken())
结果:p:sid:e3f9ff89eaf74a3ba208aa6ba74d00a44043