python之re和logging模块

1、re模块

1.1re模块的概念

re模块就其本质而言,正则表达式(或RE)是一种小型的、高度专业化的编程语言,它内嵌于python中,并通过re模块实现。正则表达式模式被编译成一系列的字节码,然后用c编写的匹配引警执行。

1.2 字符匹配

普通字符:大多数字符和字母都会和自身匹配。

 import  re
>>> re.findall(‘czd‘,‘chenyzczdcqy‘)
[‘czd‘]

元字符:

. 通配符,数字字母都可以匹配,除了“\n”以外,一个点代表一个字符
^ 表示以...开头。在多行模式中匹配每一行的开头
$ 表以...结尾      在多行模式中匹配每一行的末尾
* 匹配前一个字符0或多次
+ 匹配前一个字符1次或无限次
? 匹配一个字符0次或1次
{} {m}匹配前一个字符m次,{m,n}匹配前一个字符m至n次,若省略n,则匹配m至无限次
[] 字符集。对应的位置可以是字符集中任意字符。字符集中的字符可以逐个列出,也可以给出范围,如[abc]或[a-c]。[^abc]表示取反,即非abc。
所有特殊字符在字符集中都失去其原有的特殊含义。用\反斜杠转义恢复特殊字符的特殊含义。
() 被括起来的表达式将作为分组,从表达式左边开始没遇到一个分组的左括号“(”,编号+1.
分组表达式作为一个整体,可以后接数量词。表达式中的|仅在该组中有效。
| 或。匹配|左右表达式任意一个,从左到右匹配,如果|没有包括在()中,则它的范围是整个正则表达式
\
转义字符,使后一个字符改变原来的意思

注意:

a.反斜杠的作用

(1)去除元字符的特殊功能

(2)反斜杠后跟普通字符实现特殊功能

b.  *  +  .  ? 都是贪婪匹配,后面加?使其变为惰性匹配。

例如:

>>> ret=re.findall("abc*?",‘abccccc‘)
>>> print(ret)
[‘ab‘]

1.3 预定义字符集

\d 匹配任何数字, 它相当于类[0-9]
\D 匹配任何字符, 它相当于类[ ^0-9]
\s 匹配任何空白字符, 相当于类[\t\n\r\f\v]
\S 匹配任何非空白字符, 相当于类[^\t\n\r\f\v]
\w 匹配任何字母数字字符,相当于类[a-z A-Z 0-9]
\W 匹配任何非字母数字字符,相当于类[^a-z A-Z 0-9]
\b
匹配一个特殊字符边界,如空格   &   #等

注意\b的用法:

w = re.findall(‘\btina‘,‘tian tinaaaa‘)
print(w)
s = re.findall(r‘\btina‘,‘tian tinaaaa‘)
print(s)
v = re.findall(r‘\btina‘,‘tian#tinaaaa‘)
print(v)
a = re.findall(r‘\btina\b‘,‘tian#[email protected]‘)
print(a)
执行结果如下:
[]
[‘tina‘]
[‘tina‘]
[‘tina‘]

1.4 元字符之分组的一些特殊用法

(?P<name>) 分组,除了原有的编号外再指定一个额外的别名
(?P=name) 引用别名为<name>的分组匹配到字符串
\<number> 引用编号为<number>的分组匹配到字符串

1.5 re模块下的常用方法

import re

# re.findall遍历匹配,可以获取字符串中所有匹配的字符串,返回一个列表。
ret=re.findall(‘alv‘,‘alvin  dong‘)
print(ret)

#re.search 格式:
# re.search(pattern, string, flags=0)
# re.search函数会在字符串内查找模式匹配,只要找到第一个匹配然后返回,如果字符串没有匹配,则返回None。
# print(re.search(‘\dcom‘,‘www.4comrunoob.5com‘).group())
# 执行结果如下:
# 4com
# 注:match和search一旦匹配成功,就是一个match object对象,而match object对象有以下方法:
# •group() 返回被 RE 匹配的字符串
# •start() 返回匹配开始的位置
# •end() 返回匹配结束的位置
# •span() 返回一个元组包含匹配 (开始,结束) 的位置
# •group() 返回re整体匹配的字符串,可以一次输入多个组号,对应组号匹配的字符串。
#
# a. group()返回re整体匹配的字符串,
# b. group (n,m) 返回组号为n,m所匹配的字符串,如果组号不存在,则返回indexError异常
# c.groups()groups() 方法返回一个包含正则表达式中所有小组字符串的元组,从 1 到所含的小组号,通常groups()不需要参数,
# 返回一个元组,元组中的元就是正则表达式中定义的组。
a = "123abc456"
 print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(0))   #123abc456,返回整体
 print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(1))   #123
 print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(2))   #abc
 print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(3))   #456
###group(1) 列出第一个括号匹配部分,group(2) 列出第二个括号匹配部分,group(3) 列出第三个括号匹配部分。
# re.match
# 决定RE是否在字符串刚开始的位置匹配。//注:这个方法并不是完全匹配。当pattern结束时若string还有剩余字符,仍然视为成功。
# 想要完全匹配,可以在表达式末尾加上边界匹配符‘$‘
ret=re.match(‘a‘,‘abcd‘).group()
print(ret)     # a

# re.split
ret=re.split(‘[ab]‘,‘abcd‘)     #先按‘a‘分割得到‘ ‘和‘bcd‘,再对‘ ‘和‘bcd‘按‘b‘分割
print(ret)     #[‘‘, ‘‘, ‘cd‘]

# re.sub
# 使用re替换string中每一个匹配的子串后返回替换后的字符串。
ret=re.sub(‘\d‘,‘abc‘,‘czd5cyz6‘,1)
print(ret)     #czdabccyz6
ret=re.subn(‘\d‘,‘abc‘,‘czd5cyz6‘)
print(ret)     #(‘czdabccyzabc‘, 2)

# re.compile
# 编译正则表达式模式,返回一个对象的模式。
# (可以把那些常用的正则表达式编译成正则表达式对象,这样可以提高一点效率.)
obj=re.compile(‘\d{3}‘)
ret=obj.search(‘abc123eee‘)
print(ret)      #<re.Match object; span=(3, 6), match=‘123‘>
print(ret.group())   #123

# finditer
# 搜索string,返回一个顺序访问每一个匹配结果(Match对象)的迭代器。
# 找到 RE 匹配的所有子串,并把它们作为一个迭代器返回。
ret=re.finditer(‘\d‘,‘asdcva123rage56a‘)   #存放到迭代器
print(ret)                        #<callable_iterator object at 0x0000029435077668>
print(next(ret).group())          #1
print(next(ret).group())          #2
# 注意
import re
ret=re.findall(‘www.(baidu|fzuniv).com‘,‘www.fzuniv.edu‘)
print(ret)    #[]
# 这是因为分组后,findall首先拿出分组里面的内容,要想匹配结果,取消权限即可
ret=re.findall(‘www.(?:baidu|fzuniv).edu‘,‘www.fzuniv.edu‘)
print(ret)     #[‘www.fzuniv.edu‘]

2、logging模块

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>NOTEST),默认的日志格式为:日志级别:logging名称:用户输出信息。

2.1 logging.basicConfig

import logging

logging.basicConfig(
    level=logging.DEBUG,
    filename=‘logger.logger‘,
    filemode=‘w‘,
    format=‘%(asctime)s [%(lineno)s] %(filename)s %(message)s‘
)

logging.debug(‘debug message‘)
logging.info(‘info message‘)
logging.warning(‘warning message‘)
logging.error(‘error message‘)
logging.critical(‘critical message‘)

# logging对象
logger=logging.getLogger()
logger.setLevel(‘DEBUG‘)
fh=logging.FileHandler(‘test_log‘)
ch=logging.StreamHandler(‘test_log‘)

fm=logging.Formatter(‘%(asctime)s %(message)s‘)

fh.setFormatter(fm)
ch.setFormatter(fm)

logger.addHandler(fh)
logger.addHandler(fh)

logger.debug(‘writen debug message‘)
logger.info(‘writen info message‘)
logger.warning(‘writen warning message‘)
logger.error(‘writen error message‘)
logger.critical(‘writen critical message‘)

在logging.basicConfig()函数中可通过具体参数来更改logging模块默认行为,可用参数有:
(1)filename:用指定的文件名创建FiledHandler,这样日志会被存在指定的文件中

(2)filemode:文件打开方式,在指定了filename时使用这个参数。默认值为‘a‘还可指定为‘w‘

(3)format:指定handler使用的日志显示格式

(4)datefmt:指定日期时间格式

(5)level:设置rootlogger的日志级别

(6)stream:用指定的stream创建StreamHandler,可以指定输出到sys.stdeer、sys.stdout或者文件

f=open(‘test.log‘,‘w‘)默认为sys.stdeer。若同时列出filename和stream两个参数,则stream参数会被会略。

format参数中可能用到的格式化串

(1) %(name)s               logger的名字

(2) %(levelno)s             数字形式的日志级别

(3) %(levelname)s        文本形式的日志级别

(4) %(pathname)s        调用日志输出函数的模块的完整路径名

(5) %(filename)s          调用日志输出函数的模块的文件名

(6) %(module)s            调用日志输出函数的模块名

(7) %(funcName)s       调用日志输出函数的函数名

(8) %(lineno)d              调用日志输出函数语句所在的代码行

(9) %(created)f             当前时间,用UNIX标准的表示时间的浮点数

(10) %(relativeCreated)s     输出日志信息时的,自logger创建以来的毫秒数

(11) %(asctime)s          字符串形式的当前时间,默认格式是“2003-07-19  17:27:43,789”,逗号后面是毫秒数

(12) %(message)s        用户输出的信息

(13) %(process)d         进程ID,可能没有

原文地址:https://www.cnblogs.com/changzhendong/p/11249650.html

时间: 2024-10-09 17:34:46

python之re和logging模块的相关文章

Python进阶(十一)----包,logging模块

Python进阶(十一)----包,logging模块 一丶包的使用 什么是包: ? 包是通过使用 .模块名的方式组织python模块名称空间的方式. 通俗来说,含有一个__init__.py文件的文件夹就是包. 包的作用: ? 将文件夹/模块组织起来,来提高程序的结构性和可维护性. ? 目的不是运行,为了导入使用.包只是一种形式,包的本质就是一个模块 import: # 创建一个包,也会发生三件事: ''' 1. 将该aaa包内 __init__py文件加载到内存. 2. 创建一个以aaa命名

python 基础 - 4.14 logging模块

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

python全栈开发-logging模块(日记专用)

一.概述 很多程序都有记录日志的需求,并且日志中包含的信息即有正常的程序访问日志,还可能有错误.警告等信息输出,python的logging模块提供了标准的日志接口,你可以通过它存储各种格式的日志,logging的日志可以分为 debug(), info(), warning(), error() and critical() 5个级别,其中他们级别大小关系 debug() <info() <warning() <error() <critical()  级别越低打印的日记等级就越

Python标准库之logging模块

很多程序都有记录日志的需求,并且日志中包含的信息即有正常的程序访问日志,还可能有错误.警告等信息输出,python的logging模块提供了标准的日志接口,你可以通过它存储各种格式的日志,logging的日志可以分为 debug().info().warning(). error() .critical() 5个级别. import logging logging.debug("debug message")logging.info("Input user/passwd&qu

python - 常用模块 - logging模块

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

Python logging模块日志存储位置踩坑

问题描述 项目过程中写了一个小模块,设计到了日志存储的问题,结果发现了个小问题. 代码结构如下: db.py run.py 其中db.py是操作数据库抽象出来的一个类,run.py是业务逻辑代码.两个文件中都有使用Python自带的logging模块,来记录日志.其中前者将日志存入到db_xxx.log下,后者存入run_xxx.log下. 两者logging相关代码为: # db.py import logging import time dt = time.time() logging.ba

Python--模块之sys模块、logging模块、序列化json模块、序列化pickle模块

sys模块 sys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit(0) sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值 示例: import sys count = 1 while count <10: print(count) if count == 8: sys.exit() count += 1 print('ending')结果:12345678 import sys print(sys.

logging 模块使用

1. logging 1.1 什么是 logging logging 模块是 Python 内置的日志管理模块,不需要额外安装. 使用: import logging logging.critical('this is critical msg') logging.error('this is error msg') logging.warning('this is warning msg') logging.info('this is info msg') 运行结果如下: CRITICAL:r

python os,sys,logging模块的使用

os模块 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改变当前脚本工作目录:相当于shell下cd os.curdir 返回当前目录: ('.') os.pardir 获取当前目录的父目录字符串名:('..') os.makedirs('dirname1/dirname2') 可生成多层递归目录 os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此