16.常用模块【logging/*re】

logging
序列化模块***
json
pickle
re正则
元字符
字符集
分组()
命名分组
管道符 |
反斜杠\
方法
re.finditer
re.search
re.match
re.split
re.sub
re.compile

logging

等级:

  1. debug
  2. info
  3. warning
  4. error
  5. critical

warning以上的才打印反馈

>>> logging.debug(‘debug------‘)
>>>
>>> s = logging.debug(‘debug------‘)
>>> print(s)
None
>>> s = logging.warning(‘debug------‘)
WARNING:root:debug------
>>> s = logging.error(‘debug------‘)
ERROR:root:debug------
>>> s = logging.critical(‘debug------‘)
CRITICAL:root:debug------

配置的两种方式:

config:

import logging
logging.basicConfig(level = logging.DEBUG,
format = ‘%(asctime)s-[%(lineno)s]-%(message)s‘,
datefmt = ‘%Y-%m-%d %H:%M:%S‘,
filename = ‘path‘,
filemode = ‘a‘)

num = 1000
logging.info(‘cost %s‘%num)

logger:

def get)logger():
logging.getLogger()

#文件显示指向
fh = logging.FileHandler(‘logger2‘)
#屏幕显示指向
sh = logging.StreamHandler()

#添加日志流
logger.addHandler(fh)
#添加日志流
logger.addHandler(sh)

#设定输出等级
logger.setLevel(logging.DEBUG)
#能单独设置fh或者sh的

#设置日志输出格式
fm = logging.Formatter(‘%(asctime)s-[%(lineno)s]-%(levelname)s-%(message)s‘)

#给文件流设置日志输出格式
fh.setFormatter(fm)
sh.setFormatter(fm)

序列化模块***

json

d = {‘scott‘:[‘student‘,‘23‘],‘jerry‘:[‘engneer‘,‘22‘]}
#将传入的数据转换成json字符串
s = json.dumps(d)
#注意此时序列化之后的s的数据类型
print(type(s))
print(s)

with open(‘new.txt‘,‘w‘) as f:
    f.write(s)

f1 = open(‘new.txt‘)
data = f1.read()

#反序列化操作
data2 = json.loads(data)
#此时反序列化之后的数据类型
print(type(data2))
print(data2)

dump方式

f = open(‘new2‘,‘w‘)

json.dump(d,f)
# 1.将d转为字符串,2.将数据写入f
f.close
i = 10
s = ‘hello‘
t = (1,4,2)
l = [3,4,7]
d = {‘name‘:‘scott‘}

json_str1 = json.dumps(i)
json_str2 = json.dumps(s)
json_str3 = json.dumps(t)
json_str4 = json.dumps(l)
json_str5 = json.dumps(d)

print(json.loads(json_str3))
#
# print(json_str1)
# print(json_str2)
# print(json_str3)
# print(json_str4)
# print(json_str5)

# json类型中没有元组类型,表现出来都是lis
# 再反序列化出来后,原来的tuple会变成list

练习

import json
d = {‘info‘:{‘name‘:‘scott‘,‘age‘:‘24‘}}

f = open(‘new3.txt‘)
data = f.read()

json.loads(data)

# 符合json字符串的格式的数据,就可以取出;注意json字典类型中key必须使用双引号

pickle

只能在两个python程序间传递数据类型

import json
import datetime

print(datetime.datetime.now())
t = datetime.datetime.now()

d = {‘data‘:t}

# 使用json会报错,json没有time类型
json.dump(d,open(‘new4‘,‘w‘))
# pickle 能支持所有的python类型交换
import pickle
s = pickle.dumps(d)
print(s)
print(type(s))
f = open(‘new5‘,‘wb‘)

f.write(s)
f.close()

f = open(‘new5‘,‘rb‘)
data = pickle.loads(f.read())

print(data)

re正则

只针对字符串数据类型进行操作

对字符串的模糊匹配

>>> ‘hello python java php c go‘.replace(‘p‘,‘P‘)
‘hello Python java PhP c go‘
>>> ‘hello python java php c go‘.find(‘p‘)
6

使用正则:

>>> import re
>>> re.findall(‘\d‘,‘fewhkhu3gk2hk6k3k4534523kgkgug‘)
[‘3‘, ‘2‘, ‘6‘, ‘3‘, ‘4‘, ‘5‘, ‘3‘, ‘4‘, ‘5‘, ‘2‘, ‘3‘]
>>> re.findall(‘\d+‘,‘fewhkhu3gk2hk6k3k4534523kgkgug‘)
[‘3‘, ‘2‘, ‘6‘, ‘3‘, ‘4534523‘]

重点就是"\d+"这个匹配规则

这个规则就是通过元字符来实现

我们平时默认使用的匹配方式就是贪婪匹配

单次获得匹配结果,按照所能获得最多值来进行匹配

如果想要获得“非贪婪匹配的结果”,可以在匹配规则的最后写一个

>>> re.findall(‘\d+‘,‘43434fefsesg64353fes512fes43f454fe‘)
[‘43434‘, ‘64353‘, ‘512‘, ‘43‘, ‘454‘]
>>> re.findall(‘\d+?‘,‘43434fefsesg64353fes512fes43f454fe‘)
[‘4‘, ‘3‘, ‘4‘, ‘3‘, ‘4‘, ‘6‘, ‘4‘, ‘3‘, ‘5‘, ‘3‘, ‘5‘, ‘1‘, ‘2‘, ‘4‘, ‘3‘, ‘4‘, ‘5‘, ‘4‘]

元字符

  • .

    匹配任何一个除了换行符以外的字符,其他例如‘\t‘、‘\n‘作一个字符看

>>> re.findall(‘p….n‘,‘hello python‘)
[‘python‘]

>>> re.findall(‘p….n‘,‘hello python pyhjhekhuehfwn‘)
[‘python‘]
  • *

    [0,无穷次];将前面的符号匹配零到无穷次,可以搭配.使用

>>> re.findall(‘p.*n‘,‘hello python pyhjhekhuehfwn‘)
[‘python pyhjhekhuehfwn‘]
>>> re.findall(‘ab*c‘,‘abbbbbbcbbbbbbc‘)
[‘abbbbbbc‘]
>>> re.findall(‘ab*c‘,‘aaaaaaaaaaac‘)
[‘ac‘]
  • +

    [1,无穷次]

>>> re.findall(‘\d+‘,‘fewhkhu3gk2hk6k3k4534523kgkgug‘)
[‘3‘, ‘2‘, ‘6‘, ‘3‘, ‘4534523‘]
>>> re.findall(‘ab+c‘,‘aaaaaaaaaaac‘)
[]
  • ?

    [0,1]

>>> re.findall(‘ab?c‘,‘abbbbbbbbbbbbbbc‘)
[]
>>> re.findall(‘ab?c‘,‘abc‘)
[‘abc‘]
>>> re.findall(‘ab?c‘,‘accccccccccccccccccc‘)
[‘ac‘]
  • {}

    {n,m}

>>> re.findall(‘ab{0,}c‘,‘abbbbbbbbbbbbbbc‘)
[‘abbbbbbbbbbbbbbc‘]
>>> re.findall(‘ab{5,30}c‘,‘abbbbbbbbbbbbbbc‘)
[‘abbbbbbbbbbbbbbc‘]

字符集

表示一个‘或’的关系

>>> re.findall(‘a[bd]c‘,‘abcbbbqwebherwtehrbbbadc‘)
[‘abc‘, ‘adc‘]

在字符集[]当中* + .等符号都变成了普通符号

除了- ^ \

>>> re.findall(‘a[*]c‘,‘abcbbbqwebherwtehrbbbadc‘)
[]
>>> re.findall(‘a[*]c‘,‘a*cbcbbbqwebherwtehrbbbadc‘)
[‘a*c‘]
  1. -
>>> re.findall(‘a[1-9]c‘,‘a43434cbcbbbqwebherwtehrbbbadc‘)
[]
>>> re.findall(‘a[1-9]c‘,‘a4cbcbbbqwebherwtehrbbbadc‘)
[‘a4c‘]
>>> re.findall(‘a[1-9]*c‘,‘a4434646821cbcbbbqwebherwtehrbbbadc‘)
[‘a4434646821c‘]
  1. ^ 开始匹配
>>> re.findall(‘^ac‘,‘a4434646821acbcbbbqwebherwtehrbbbadc‘)
[]
>>> re.findall(‘^ac‘,‘ac4434646821cbcbbbqwebherwtehrbbbadc‘)
[‘ac‘]

但在字符集当中[^]表示取反

>>> re.findall(‘[^4]‘,‘ac4434646821cbcbbbqwebherwtehrbbbabc‘)
[‘a‘, ‘c‘, ‘3‘, ‘6‘, ‘6‘, ‘8‘, ‘2‘, ‘1‘, ‘c‘, ‘b‘, ‘c‘, ‘b‘, ‘b‘, ‘b‘, ‘q‘, ‘w‘, ‘e‘, ‘b‘, ‘h‘, ‘e‘, ‘r‘, ‘w‘, ‘t‘, ‘e‘, ‘h‘, ‘r‘, ‘b‘, ‘b‘, ‘b‘, ‘a‘, ‘b‘, ‘c‘]

>>> re.findall(‘[^\d]‘,‘ac4434646821cbcbbbqwebherwtehrbbbabc‘)
[‘a‘, ‘c‘, ‘c‘, ‘b‘, ‘c‘, ‘b‘, ‘b‘, ‘b‘, ‘q‘, ‘w‘, ‘e‘, ‘b‘, ‘h‘, ‘e‘, ‘r‘, ‘w‘, ‘t‘, ‘e‘, ‘h‘, ‘r‘, ‘b‘, ‘b‘, ‘b‘, ‘a‘, ‘b‘, ‘c‘]

>>> re.findall(‘[^\d].‘,‘ac4434646821cbcbbbqwebherwtehrbbbabc‘)
[‘ac‘, ‘cb‘, ‘cb‘, ‘bb‘, ‘qw‘, ‘eb‘, ‘he‘, ‘rw‘, ‘te‘, ‘hr‘, ‘bb‘, ‘ba‘, ‘bc‘]
>>> re.findall(‘[^\d]*‘,‘ac4434646821cbcbbbqwebherwtehrbbbabc‘)
[‘ac‘, ‘‘, ‘‘, ‘‘, ‘‘, ‘‘, ‘‘, ‘‘, ‘‘, ‘‘, ‘‘, ‘cbcbbbqwebherwtehrbbbabc‘, ‘‘]
>>> re.findall(‘[^\d]+‘,‘ac4434646821cbcbbbqwebherwtehrbbbabc‘)
[‘ac‘, ‘cbcbbbqwebherwtehrbbbabc‘]

3.$ 结尾匹配

>>> re.findall(‘abc$‘,‘ac4434646821cbcbbbqwebherwtehrbbbabc‘)
[‘abc‘]
>>> re.findall(‘cabc$‘,‘ac4434646821cbcbbbqwebherwtehrbbbabc‘)

注意,要严格匹配规则

分组()

>>> re.findall(‘ad+‘,‘addddddddd‘)
[‘addddddddd‘]
>>> re.findall(‘(ad)+‘,‘addddddddd‘)
[‘ad‘]
>>> re.findall(‘(ad)+scott‘,‘adddddscottddddfesgeg‘)
[]
>>> re.findall(‘(ad+)+scott‘,‘adddddscottddddfesgeg‘)
[‘addddd‘]
#涉及到分组的时候,优先获得分组内的内容,如果要取消分组内的特权,需要用到`?:`语法
>>> re.findall(‘(\d)+scott‘,‘addddd354331351scottddddfesgeg‘)
[‘1‘]
>>> re.findall(‘(?:\d)+scott‘,‘addddd354331351scottddddfesgeg‘)
[‘354331351scott‘]
命名分组

re.findall(r‘\w+\articals\\d{4}‘,‘scott45\articals\1234‘)

>>> re.findall(r‘(\w+)\.articals\.(\d{4})‘,‘scott45.articals.1234‘)
[(‘scott45‘, ‘1234‘)]

>>> re.search(r‘(?P<author>\w+)\.articals\.(?P<id>\d{4})‘,‘scott45.articals.1234‘)
<_sre.SRE_Match object; span=(0, 21), match=‘scott45.articals.1234‘>

>>> ret = re.search(r‘(?P<author>\w+)\.articals\.(?P<id>\d{4})‘,‘scott45.articals.1234‘)
>>> ret.group(‘id‘)
‘1234‘

管道符 |

>>> re.findall(‘www\.(?:oldboy|baidu)\.com‘,‘www.oldboy.com‘)
[‘www.oldboy.com‘]

反斜杠\

  • 能让普通符号变成有特殊功能的符号

    \d 匹配任何十进制数

    \D 匹配任何非数字字符;相当于[^0-9]

    \s 匹配任何空白字符‘ ’

    \S 匹配任何非空白字符

    \w 匹配任意一个数字或者字母,无法获得特殊符号或者空格

    \b 匹配任何边界字符

>>> re.findall(‘\bI‘,‘hello I am LIA‘)
[]
>>> re.findall(r‘\bI‘,‘hello I am LIA‘)
[‘I‘]
>>> re.findall(r‘\bI‘,‘hello:I:am:LIA‘)
[‘I‘]

使用r将字符串变为原生字符串

>>> re.findall(r‘\w+\\articals\\\d{4}‘,r‘scott45\articals\1234‘)
[‘scott45\\articals\\1234‘]
  • 让特殊符号变为普通无功能的符号

    .

    *

获取运算式中的乘法运算

>>> re.findall(‘\d\*\d‘,‘2*6+7*45+1.4*3-8/4‘)
[‘2*6‘, ‘7*4‘, ‘4*3‘]
>>> re.findall(‘\d+\.?\d*\*\d+\.?\d*‘,‘2*6+7*45+1.4*3-8/4‘)
[‘2*6‘, ‘7*45‘, ‘1.4*3‘]
# 关键在于抓取一个浮点数的模型`\d+\.?\d*`

方法

re.finditer

返回一个迭代器

re.finditer(‘\d‘,‘ad324das65‘)

想要取出值的话

re.search

匹配到第一个结果后,就不再往下匹配;匹配不到的时候会返回一个False

>>> re.search(‘\d+‘,‘ad324das65‘)
<_sre.SRE_Match object; span=(2, 5), match=‘324‘>
# span中的信息表示匹配对象的位置
>>> re.search(‘\d+‘,‘ad324das65‘).group()
‘324‘
# 用.group()获取结果

re.match

match只在字符串开始的位置匹配,如果没有,就不返回任何结果

>>>re.match(‘\d+‘,‘464684ad324das65‘).group()
‘464684‘
>>> re.match(‘\d+‘,‘ad324das65‘).group()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: ‘NoneType‘ object has no attribute ‘group‘
# 不能使用group方法
>>> re.match(‘\d+‘,‘ad324das65‘)

re.split

模糊定义分隔符,对字符串进行分割

>>>re.split(‘\d+‘,‘fhdfs153434efsfes13se1fse534sfe‘)
[‘fhdfs‘, ‘efsfes‘, ‘se‘, ‘fse‘, ‘sfe‘]
# 第三个参数定义分割次数,次数耗尽后一次性返回后面剩余的字符
>>>re.split(‘\d+‘,‘fhdfs153434efsfes13se1fse534sfe‘,3)
[‘fhdfs‘, ‘efsfes‘, ‘se‘, ‘fse534sfe‘]
# 两个分隔符相连的情况,会打出一个空字符串
>>>re.split(‘d‘,‘fhdfs153434efddsfes13se1fse534sfe‘,3)
[‘fh‘, ‘fs153434ef‘, ‘‘, ‘sfes13se1fse534sfe‘]

re.sub

替换

re.sub(规则,替换内容,原字符串)

>>>re.sub(‘\d‘,‘*‘,‘fhdfs153434efddsfes13se1fse534sfe‘)
‘fhdfs******efddsfes**se*fse***sfe‘
# subn会多返回一个替换次数的结果
>>>re.subn(‘\d‘,‘*‘,‘fhdfs153434efddsfes13se1fse534sfe‘)
(‘fhdfs******efddsfes**se*fse***sfe‘, 12)

re.compile

直接定义规则,之后对多个字符串进行操作的时候会提升便利的程度

>>> ret = re.compile(‘\d+‘)
>>> ret.findall(‘fhdfs153434efddsfes13se1fse534sfe‘)
[‘153434‘, ‘13‘, ‘1‘, ‘534‘]

<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">

时间: 2024-10-16 05:58:52

16.常用模块【logging/*re】的相关文章

python常用模块——logging

日志模块 logging 默认情况下Python的logging模块的日志级别是warning,默认输出到标准输出stdout 默认的日志格式为 日志级别:Logger名称:用户输出消息: 设置logging的默认格式及输出位置使用basicConfig方法. 一. logging模块的常用方法 1. basicConfig(**kwargs) 配置日志基本配置:参数可以是如下: filename:用指定的文件名创建FiledHandler(后边会具体讲解handler的概念),这样日志会被存储

Python自动化运维之常用模块—logging

在现实生活中,记录日志非常重要.银行转账时会有转账记录:如果有出现什么问题,人们可以通过日志数据来搞清楚到底发生了什么.    对于系统开发.调试以及运行,记录日志都是同样的重要.如果没有日志记录,程序崩溃时你几乎就没办法弄明白到底发生了什么事情.1.简单使用 import logging logging.debug('debug message') logging.info('info message') logging.warn('warn message') logging.error('

python - 常用模块 - logging模块

python主要是通过logging模块来进行日志处理 很多程序都有记录日志的需求,并且日志中包含的信息即有正常的程序访问日志,还可能有错误.警告等信息输出,python的logging模块提供了标准的日志接口, 你可以通过它存储各种格式的日志,logging的日志可以分为 debug(), info(), warning(), error(), critical() 5个级别, 日志级别: DEBUG INFO WARNING ERROR CRITICAL等级依次提高(打印的信息越来越少,DE

Python全栈之路----常用模块----logging模块

很多程序都有记录日志的需求,并且日志中包含的信息即有正常的程序访问日志,还可能有错误.警告等信息输出,python的logging模块提供了标准的日志接口,你可以通过它存储各种格式的日志,logging的日志可以分为 debug()调试, info()记录, warning()有潜在问题, error()出问题 and critical()严重问题5个级别,下面我们看一下怎么用. 最简单用法 import logging logging.warning("user [alex] attempte

python 常用模块 time random os模块 sys模块 json &amp; pickle shelve模块 xml模块 configparser hashlib subprocess logging re正则

python 常用模块 time random os模块 sys模块 json & pickle shelve模块 xml模块 configparser hashlib  subprocess logging re正则 转自老男孩老师Yuan:http://www.cnblogs.com/yuanchenqi/articles/5732581.html 模块&包(* * * * *) 模块(modue)的概念: 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,

python常用模块上篇

python常见模块 分两篇分别介绍下述模块 time模块 random模块 hashlib模块 os模块 sys模块 logging模块 序列号模块 configparser模块 re模块 time模块 在python中,通常有这三种方式来表示时间:时间戳.元组(struct_time).格式化的时间字符串: 1)时间戳:通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量.我们运行"type(time.time())",返回的是float类型. (2)格

python日志模块-logging

日志模块 logging logging模块主要可以根据自定义日志信息,在程序运行的时候将日志打印在终端及记录日志到文件中.在这先了解一下logging支持的日志五个级别 debug() 调试级别,一般用于记录程序运行的详细信息 info() 事件级别,一般用于记录程序的运行过程 warnning() 警告级别,,一般用于记录程序出现潜在错误的情形 error() 错误级别,一般用于记录程序出现错误,但不影响整体运行 critical 严重错误级别 , 出现该错误已经影响到整体运行 简单用法,将

python常用模块-------转自林海峰老师

常用模块 一 time模块 在Python中,通常有这几种方式来表示时间: 时间戳(timestamp):通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量.我们运行"type(time.time())",返回的是float类型. 格式化的时间字符串(Format String) 结构化的时间(struct_time):struct_time元组共有9个元素共九个元素:(年,月,日,时,分,秒,一年中第几周,一年中第几天,夏令时) 1 import tim

Day5 - Python基础5 常用模块学习

Python 之路 Day5 - 常用模块学习 本节大纲: 模块介绍 time &datetime模块 random os sys shutil json & picle shelve xml处理 yaml处理 configparser hashlib subprocess logging模块 re正则表达式 模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,