Python - 模块(二)
re
re模块提供了正则表达式的相关操作
主要字符介绍:
.
通配符,除了换行符之外的任意字符
^
匹配字符串的开始
$
匹配字符串的结尾
关于次数的:
*
按紧挨着的字符重复无数次, 重复零次或更多次
+
1到无穷次, 重复一次或更多次
?
(0,1) 重复零次或一次
{n}
重复n次
{n,}
重复n次或更多次
{n,m}
重复n到m次
其他的:
[]
字符集
|
或
()
分组
\\
转义
\\A
只在字符串开始进行匹配
\\Z
只在字符串结尾进行匹配
\\b
匹配一个特殊字符边界, 如空格$
\\B
匹配不位于开始或结尾的空字符串
\\d
相当于[0-9]
\\D
相当于[^0-9]
\\s
匹配任意空字符串:[\\t\\n\\r\\v]
\\S
匹配任意非空白字符:[^\\t\\n\\r\\v]
\\w
匹配任意数字和字母: [a-zA-Z0-9]
\\W
匹配任意非数字和字母: [^a-zA-Z0-9]
. ^ $ * + ? {} 一些用法
import re
print(re.findall("a..x","helloalex"))#[\'alex\'] 点匹配任意一个,但是只能匹配一个
print(re.findall("^a..x","alexhelloworld"))#[\'alex\'] ^ 匹配以什么开始
print(re.findall("a..x$","helloalex"))#[\'alex\'] $ 匹配以什么结尾
print(re.findall("alex*","helloalexxxxx"))#[\'alexxxxx\'] * 贪婪匹配 *表示匹配0次或更多次
print(re.findall("alex+","helloalexxx"))#[\'alexxx\'] +表示匹配1次或更多次
print(re.findall("alex?","helloalexxxx"))#[\'alex\'] ? 表示匹配0到1次
print(re.findall("alex{1,2}","alexxxx"))#[\'alexx\']
注意:前面的*,+,?等都是贪婪匹配,也就是尽可能匹配,后面加?号使其变成惰性匹配
元字符之字符集[]
存在或的关系 至少匹配一个 在字符集中含有特殊意义的只有三个 ^(非) \\(转义) -(范围)
print(re.findall(\'a[bc]d\',\'acd\'))#[\'acd\'] []字符集中有或的概念
print(re.findall(\'[a-z]\',\'acd\'))#[\'a\', \'c\', \'d\'] #范围a—z 都可以匹配到
print(re.findall(\'[.*+]\',\'a.cd+\'))# [\'.\', \'+\']
print(re.findall(\'[1-9]\',\'45dha3\'))# [\'4\', \'5\', \'3\']
print(re.findall(\'[^ab]\',\'45bdha3\'))# [\'4\', \'5\', \'d\', \'h\', \'3\'] ^ 代表非的概念
print(re.findall(\'[\\d]\',\'45bdha3\'))# [\'4\', \'5\', \'3\'] \\d 表示0到9的数字
关于转义的实例 \\
import re
ret=re.findall(\'c\\l\',\'abc\\le\')
print(ret) # 报错
ret=re.findall(\'c\\\\l\',\'abc\\le\')
print(ret) # 报错
ret=re.findall(\'c\\\\\\\\l\',\'abc\\le\')
print(ret) #[\'c\\\\l\']
ret=re.findall(r\'c\\\\l\',\'abc\\le\')
print(ret)#[\'c\\\\l\'] # 一张图解释为什么要用到这么多 \\ 的原因
分组() 的用法
print(re.findall(r\'(ad)+\', \'addad\')) # [\'ad\', \'ad\']
ret=re.search(\'(?P<id>\\d{2})/(?P<name>\\w{3})\',\'23/com\')
print(ret.group())#23/com
print(ret.group(\'id\'))#23
| 或
ret=re.search(\'(ab)|\\d\',\'rabhdg8sd\')
print(ret.group())#ab 先匹配到哪个取哪个 group表示取值
re下面的方法
comoile
obj=re.compile(\'\\d{5}\') # compile是编译的意思,编译好一个规则,再进行调用它
ret=obj.search(\'abc12345ee\')
print(ret.group())#12345
serch
print(re.search(\'al\',\'alvin yuan\').group()) # al
# 函数会在字符串内查找模式匹配,只到找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以
# 通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。
findall
print(re.findall(\'a\',\'alvin yuan\'))# [\'a\', \'a\']
# 返回所有满足匹配条件的结果,放在列表里
match
ret = re.match(\'a\',\'abc\').group() # match只是从开始匹配,匹配成功则返回对象
print(ret)
split
ret=re.split(\'[ab]\',\'abcd\') # 先按\'a\'分割得到\'\'和\'bcd\',在对\'\'和\'bcd\'分别按\'b\'分割
print(ret)#[\'\', \'\', \'cd\'] # 结果放在列表中
sub(subn)
ret=re.sub(\'\\d\',\'abc\',\'alvin5yuan6\',1) # sub里面至少有个三个参数 依次是 匹配规则 替换内容 源数据 也可以有四个,最后一个参数是匹配次数
print(ret)#alvinabcyuan6
ret=re.subn(\'\\d\',\'abc\',\'alvin5yuan6\') # 显示匹配了多少次,替换
print(ret)#(\'alvinabcyuanabc\', 2)
finditer
ret=re.finditer(\'\\d\',\'ds3sy4784a\')
print(ret) #<callable_iterator object at 0x10195f940>
print(next(ret).group())
print(next(ret).group())
# 结合迭代器规则,返回的是一个迭代器对象,应用于处理很多的数据,用next的可以逐一取
?: 是取消优先级 ?P的含义
print(re.search("(?P<name>[a-z]+)(?P<age>\\d+)","alex36wusir27").group("name"))
# alex 注释 ?P是定义死的 <定义分组名> 后面可根据分组名取值
print(re.findall("www\\.(baidu|taobao)\\.com","sdaswww.baidu.comsdf"))
# [\'baidu\'] 优先给分组的内容,其实已经匹配到了
print(re.findall("www\\.(?:baidu|taobao)\\.com","sdaswww.baidu.comsdf"))
# [\'www.baidu.com\'] ?: 表示去掉括号内的优先级
logging
用于便捷记录日志且线程安全的模块
日志级别大小关系为:CRITICAL ERROR WARNING INFO DEBUG NOTSET,当然也可以自己定义日志级别。
level=logging.DEBUG 设置日志级别
import logging
logging.basicConfig(filename=\'log.log\',
format=\'%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s\',
datefmt=\'%Y-%m-%d %H:%M:%S %p\',
level=logging.DEBUG)
logging.debug(\'debug\') # 分五个等级
logging.info(\'info\')
logging.warning(\'warning\')
logging.error(\'error\')
logging.critical(\'critical\')
logging.log(10,\'log\')
文件输出如下:
format 设置输出格式
%(levelno)s: 打印日志级别的数值
%(levelname)s: 打印日志级别名称
%(pathname)s: 打印当前执行程序的路径,其实就是sys.argv[0]
%(filename)s: 打印当前执行程序名
%(funcName)s: 打印日志的当前函数
%(lineno)d: 打印日志的当前行号
%(asctime)s: 打印日志的时间
%(thread)d: 打印线程ID
%(threadName)s: 打印线程名称
%(process)d: 打印进程ID
%(message)s: 打印日志信息
datefmt 设置日期格式,同 time.strftime()
%Y 年 %m 月 %D日 %H时 %M分 %S 秒
filename 设置文件路径
filemode 设置文件打开模式
注:没有filename和filemode直接输出
os
用于提供系统级别的操作
os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径
os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd
os.curdir 返回当前目录: (\'.\')
os.pardir 获取当前目录的父目录字符串名:(\'..\')
os.makedirs(\'dir1/dir2\') 可生成多层递归目录
os.removedirs(\'dirname1\') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
os.mkdir(\'dirname\') 生成单级目录;相当于shell中mkdir dirname
os.rmdir(\'dirname\') 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
os.listdir(\'dirname\') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印 ***
os.remove() 删除一个文件
os.rename("oldname","new") 重命名文件/目录 ***
os.stat(\'path/filename\') 获取文件/目录信息,相关信息的介绍 size 文件大小 atime 上次访问时间 mtime 上次修改时间 ctime 查看创建时间
os.sep 操作系统特定的路径分隔符,win下为"\\\\",Linux下为"/"
os.linesep 当前平台使用的行终止符,win下为"\\t\\n",Linux下为"\\n"
os.pathsep 用于分割文件路径的字符串
os.name 字符串指示当前使用平台。win->\'nt\'; Linux->\'posix\'
os.system("bash command") 运行shell命令,直接显示
os.environ 获取系统环境变量
os.path.abspath(path) 返回path规范化的绝对路径
os.path.split(path) 将path分割成目录和文件名二元组返回
os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素
os.path.basename(path) 返回path最后的文件名。如何path以/或\\结尾,那么就会返回空值。即os.path.split(path)的第二个元素
os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False
os.path.isabs(path) 如果path是绝对路径,返回True
os.path.isfile(path) 如果path是一个存在的文件,返回True。否则返回False
os.path.isdir(path) 如果path是一个存在的目录,则返回True。否则返回False
os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略,涉及文件路径拼接就用它
os.path.getatime(path) 返回path所指向的文件或者目录的最后存取时间
os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间
上图所示, 是得到:
os.path.dirname是返回上一级目录
获取文件大小的三种方式
import os
res = os.path.getsize(os.path.join("F:\\python\\PycharmProjects\\date2017.1.8","path_search.py"))
print(res)
ret = os.stat(os.path.join("F:\\python\\PycharmProjects\\date2017.1.8","path_search.py")).st_size
print(ret)
f = open(os.path.join("F:\\python\\PycharmProjects\\date2017.1.8","path_search.py"),"rb")
print(len(f.read()))
输出结果相同
os模块的补充
os.walk(top, topdown=True, onerror=None, followlinks=False)
可以得到一个三元tupple(dirpath, dirnames, filenames),
第一个为起始路径,第二个为起始路径下的文件夹,第三个是起始路径下的文件。
dirpath 是一个string,代表目录的路径,
dirnames 是一个list,包含了dirpath下所有子目录的名字。
filenames 是一个list,包含了非目录文件的名字。
这些名字不包含路径信息,如果需要得到全路径,需要使用os.path.join(dirpath, name).
通过for循环自动完成递归枚举
# 做个简单的例子,输出crm目录的下所有文件的路径信息
for a,b,c in os.walk(str(PATH) + os.sep + "crm" ):
for item in c:
# print(item)
print(os.path.join(a,item))
输出
F:\\python\\crm\\.idea\\.name
F:\\python\\crm\\.idea\\crm.iml
F:\\python\\crm\\.idea\\encodings.xml
F:\\python\\crm\\.idea\\misc.xml
F:\\python\\crm\\.idea\\modules.xml
F:\\python\\crm\\.idea\\workspace.xml
F:\\python\\crm\\bin\\bin.py
F:\\python\\crm\\bin\\__init__.py
F:\\python\\crm\\bin\\__pycache__\\bin.cpython-35.pyc
F:\\python\\crm\\core\\admin.py
F:\\python\\crm\\core\\coures.py
F:\\python\\crm\\core\\grade.py
F:\\python\\crm\\core\\school.py
F:\\python\\crm\\core\\student.py
F:\\python\\crm\\core\\teacher.py
F:\\python\\crm\\core\\__init__.py
F:\\python\\crm\\core\\__pycache__\\admin.cpython-35.pyc
F:\\python\\crm\\core\\__pycache__\\coures.cpython-35.pyc
F:\\python\\crm\\core\\__pycache__\\grade.cpython-35.pyc
F:\\python\\crm\\core\\__pycache__\\school.cpython-35.pyc
F:\\python\\crm\\core\\__pycache__\\student.cpython-35.pyc
F:\\python\\crm\\core\\__pycache__\\teacher.cpython-35.pyc
F:\\python\\crm\\core\\__pycache__\\__init__.cpython-35.pyc
F:\\python\\crm\\db\\admin\\alex
F:\\python\\crm\\db\\coures\\23eeeb4347bdd26bfc6b7ee9a3b755dd
F:\\python\\crm\\db\\coures\\34d1f91fb2e514b8576fab1a75a89a6b
F:\\python\\crm\\db\\coures\\c71e8d17d41c21de0d260881d69662ff
F:\\python\\crm\\db\\coures\\df5fb5e33c5585bb0c48107c57cece9b
F:\\python\\crm\\db\\coures\\e206a54e97690cce50cc872dd70ee896
F:\\python\\crm\\db\\grade\\270c42ba7614f1a475f61dfcb397a621
F:\\python\\crm\\db\\grade\\817ee0b8010393ff3b4483e703663551
F:\\python\\crm\\db\\school\\17811d3caeff9648f48b5a553c806c63
F:\\python\\crm\\db\\school\\b035c88ee6f5270ccff67a591d0e21ec
F:\\python\\crm\\db\\school\\bb0ac3d8eb8f2c2f6fe336c5e9957392
F:\\python\\crm\\db\\school\\e523d5f211747bdfc742f50463577f74
F:\\python\\crm\\db\\student\\6e7e12c264fb3e1f456b0782f47e4af6
F:\\python\\crm\\db\\student\\a0b5e2d3a97d7a19ec6d2da830f609b2
F:\\python\\crm\\db\\student\\a995b03ed63f8c7128a83c984b89aa50
F:\\python\\crm\\db\\student\\fe01b2ba5ec0146e5d4b0885822556ef
F:\\python\\crm\\db\\student\\ff4916088e836d268a9d72f8929bac06
F:\\python\\crm\\db\\teacher\\08319d4fed47c8ed828ebabd5a91563b
F:\\python\\crm\\db\\teacher\\0d1d5cd3623144f692fb771580b92288
F:\\python\\crm\\db\\teacher\\5d00d0762936aedda519d63c2e4a2a40
F:\\python\\crm\\db\\teacher\\6a7ece82e4ed94a475dab275891d5036
F:\\python\\crm\\lib\\ceshi.py
F:\\python\\crm\\lib\\readme
F:\\python\\crm\\lib\\readwrite.py
F:\\python\\crm\\lib\\__init__.py
F:\\python\\crm\\lib\\__pycache__\\readwrite.cpython-35.pyc
F:\\python\\crm\\lib\\__pycache__\\__init__.cpython-35.pyc