Python之模块、正则

一、模块
import 模块的实质就是把要导入模块里面的代码,从上到下执行一遍,找模块的顺序是,先从当前目录下找,找不到的话,再环境变量里面找
导入的模块名字最好不要有.,a.
import sys
print(sys.path)#当前环境变量有哪些,针对python,并不是整个系统
标准模块:
python自带的,不需要安装的,直接import就能用的
自己写的模块:
也就是自己写的python
第三方模块:
别人已经开发好的功能,需要安装的
利用pip python安装目录scripts下有pip命令,要用这个命令就得把scripts目录加入到环境变量
安装方式第一种:
这是操作系统命令,不是在python命令行里面执行
pip install xx 安装某个模块
pip list 查看已经安装的模块
pip uninstall xxx 卸载 模块
pip这个模块,在python3里面是python自带的,安装完python就能直接用,但是在python2里面是没有这个模块的,需要你手动安装才能用
easy_install requests也可以安装,这个也是傻瓜式安装试,python3自带,python2需要手动安装

第二种方式,手动安装:
1.先下载安装包,直接百度搜,比如说python requests 模块
2.解压安装包
3.在解压的目录下执行python setup.py install


2. os模块
import os #导入os模块
print(os.getcwd())
print(os.chdir(r"e"\byz_code\day2")) #更改当前目录
print(os.mkdir(r"test1")) #创建文件夹
print(os.makedirs(r"test1\test2")) # 递归创建文件夹,父目录不存在时创建父目录
print(os.removedirs(r"test1\test2"))#递归删除空目录
print(os.rmdir("test1")) # 删除指定的文件夹,只能删除空文件夹
print(os.remove(r"E:\byz_code\day4\a.txt"))#删除文件
r是代表原字符,代表原样输出,不转义
os.rename("test","test1")#重命名
print(os.sep)#当前操作系统的路径分隔符
print(os.listdir(".")) #列出一个目录下的所有内容
print(__file__)#代表当前文件
print(os.path.abspath('bb.py'))#获取绝对路径
print(os.path.dirname)#获取父目录
print(os.path.dirname(os.path.dirname(__file__)))#获取父目录
print(os.path.exists('hhaaa'))#目录/文件是否存在
print(os.path.isfile('bb.py'))#判断是否是一个文件
print(os.path.isdir("/usr/local"))#是否是一个路径
print(os.path.join("root",'hehe','haha','a.log')) #拼接成一个路径
sys.path.append(r'e:\002\hhaa') 添加环境变量不能写死
sys.path.append(os.path.dirname(__file__)) 把父目录加到环境变量

 

3.sys模块
import sys #导入sys模块
sys.argv #命令行参数list,第一个元素是程序本身路径
sys.exit('xxx') #退出程序,正常退出时exit(0) xxx为提示信息
sys.version #获取Python解释程序的版本信息
sys.path #返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
sys.platform #返回操作系统平台名称
sys.stdout.write('please:') #向屏幕输出一句话
val = sys.stdin.readline()[:-1] #获取输入的值


二、软件开发规范
软件开发规范目录及文件说明

bin:可执行文件,程序入口
conf:放配置文件
core:核心文件
data:数据存储文件
logs:日志文件
README.md:说明文件
目录结构如图所示

import os,sys
path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) #当前目录
#sys.path.append(path) #末尾添加,但如果有其它路径中有相同模块,先找到就直接返回,不往下找了,最好用insert放到首位
sys.path.insert(0,path) #放到环境变量首位,避免有相同模块,找不到
#sys.path.pop(0)#删除环境变量
如果目录已经加到环境变量,可以右键Mark Directory as-->Source Root,这样使用的时候会用方法提示

 

3.时间、日期操作
time和datetime模块主要用于操作时间
时间有三种表示方式,一种是时间戳、一种是格式化时间、一种是时间元组
import time,datetime
time.sleep(1) 休息几秒
print(int(time.time())) # 获取当前时间戳 time.time()是float类型的,要用就转一下
print(time.strftime("%Y.%m.%d %H:%M:%S")) # 将时间元组转换成格式化输出的字符串
%Y年 %m 月份 %d天 %H小时 %M代表分钟 %S代表的是秒
print(time.struct_time) # 时间元组
print(time.asctime()) # 时间元转换成格式化时间
print(time.ctime()) # 时间戳转换成格式化时间
print(datetime.datetime.now()) # 当前时间格式化输出
print(datetime.datetime.now() + datetime.timedelta(3)) # 3天后的时间
print(datetime.datetime.now() + datetime.timedelta(-3)) # 3天前的时间

 

三、正则表达式
正则表达式就是用来查找字符串的,它能查找规则比较复杂的字符串
re模块是正则表达式模块,用来匹配一些特定的字符串
import re
1.常用的匹配语法
re.match 从头开始匹配
re.search 匹配包含
re.findall 把所有匹配到的字符放到以列表中的元素返回
re.splitall 以匹配到的字符当做列表分隔符
re.sub 匹配字符并替换


(1)match方法
match方法接收3个参数,第一个是匹配的规则,也就是正则表达式,第二个是要查找的字符串,
第三个参数不是必填的,用于控制正则表达式的匹配方式,看下面正则表达式的匹配模式。是从字符串的第一个单词中匹配字符串,如果匹配到返回一个对象,如果匹配不到,则返回None

import re
s = 'besttest is good'
print(re.match(r"be",s)) #打印的是一个对象
#字符串前面加r代表原字符串
print(re.match(r"be",s).group()) #查看结果
print(re.match(r'is',s))
结果:
<_sre.SRE_Match object; span=(0, 2), match='be'>
be
None

(2)search方法
search方法的参数和match一样,和match方法不一样的是,match是从字符串里面的第一个单词里面找,而search方法则是从字符串的整个内容里面找,如果找到了就返回第一个,找不到就返回None
import re
s = 'besttest is good is is is '
print(re.search(r'is',s).group())
结果:is
查找到就返回,只返回一个,可以用来判断

(3)findall方法
findall方法的参数上面的match、search一样,和他们不一样的是,findall会返回所有一个list,把所有匹配到的字符串,放到这个list里面,如果找不到的话,就返回一个空的list
import re
s = 'besttest is good is is is '
print(re.findall(r'is',s))
结果:['is', 'is', 'is', 'is']
print(re.findall(r'sss',s))
结果:[] #找不到结果为一个空列表
返回结果为一个list


(4)sub方法
sub方法和字符串的replace方法一样,是用来替换字符串的,把匹配到的值替换成一个新的字符串,接收3个参数,第一个是正则表达式,第二个是要替换成什么,第三个就是要查找的字符串,会返回一个新的字符串,如果匹配不到的话,返回原来的字符串
import re
s = 'besttest is good is is is '
print(re.sub(r'best','Best',s))
结果:Besttest is good is is is

(5)split方法
split 方法和字符串的split方法一样,是用来分割字符的,按照匹配到的字符串进行分割,返回的是一个list,如果匹配不到的话,那返回的list中还是原来的字符串
import re
s = 'besttest is good is is is '
print(re.split(r'best',s))
结果:['', 'test is good is is is ']


2.常用正则表达式符号:
(1)数量词
'*' 匹配*号前的字符0次或多次,只是*前面的一个字符
print(re.findall(r'be*','besttest very best b'))
结果:['be', 'be', 'b']

'+' 匹配前一个字符1次或多次,只是+前面的一个字符
print(re.findall(r'st+','besttest is best'))
结果: ['stt', 'st', 'st']

'?' 匹配前一个字符1次或0次,只是?前面的一个字符
print(re.findall(r'st?','besttest is best'))
结果:['st', 'st', 's', 'st']

'{m}' 匹配前一个字符m次
print(re.findall(r't{2}','besttest is best'))
结果: ['tt']

'{n,m}' 匹配前一个字符n到m次
print(re.findall(r't{1,2}','besttest is best'))
结果: ['tt', 't', 't']

(2)一般字符
'.' 默认匹配除\n之外的任意一个字符
print(re.findall(r'b.','besttest is good'))
结果:['be']

'\' 转译符,前面的* + ?这样的字符都有特殊含义了,如果你想就想找它的话,那就得转译了
意思就是说如果你想让特殊字符失去以前的含义,那么就得给它前面加上\
print(re.findall(r'\?','besttest is best????'))
>>> ['?', '?', '?', '?']

'|' 匹配|左或|右的字符
print(re.findall(r'best|is','besttest is best'))
结果:['best', 'is', 'best']

'[]' 字符集合,某些字符的集合,匹配的时候是这个集合里面的任意一个就行
print(re.findall(r'be[stacj]','besttest is best bejson'))
结果:['bes', 'bes', 'bej']

在[]里面如果用^的话代表取反,也就是不包括的这些字符串的
print(re.findall(r'be[^stac]','besttest is best bejson'))

(3)边界匹配
'^' 匹配以什么字符开头,多行情况下匹配每一行的开头
print(re.findall(r'^b','besttest is good'))
结果: ['b']
print(re.findall(r'^b','besttest is good\nbest',re.M))#多行模式
结果: ['b','b']


'$' 匹配以什么字符结尾,多行情况下匹配每一行的结尾
print(re.findall(r'd$','besttest is good'))
结果:['d']
print(re.findall(r'd$','besttest is good\nbest is good',re.M<span style="line-height:1.5;">))#多行模式</span> >>>['d','d']

'\A' 仅以什么字符开头,和^不同的是它不能用多行模式
print(re.findall(r'\Ab','besttest is good'))
结果: ['b']

'\Z' 仅以什么字符结尾,和$不同的是它不能用多行模式
print(re.findall(r'd\Z','besttest is good'))
结果:['d']

(4)预定义字符集合
'\d' 匹配数字0-9
print(re.findall(r'\d+','sdf2342312sdfs'))
结果: ['2342312']

'\D' 匹配非数字
print(re.findall(r'\D','sdf2342312sdfs'))
结果:['sdf', 'sdfs']

'\w' 匹配[A-Za-z0-9],也就是所有的字母和数字和中文
print(re.findall(r'\w','sdf234%^2312sdfs&'))
结果:['sdf234', '2312sdfs']

'\W' 匹配不是[A-Za-z0-9],也就是不是字母和数字
print(re.findall(r'\W','sdf234%^2312sdfs&'))
结果:['%', '^', '&']

'\s' 匹配空白字符、\t、\n、\r,空格
print(re.findall('\s','axss\n\tsdf\t\r\t'))
结果: ['\n', '\t', '\t', '\r', '\t']

'\S'匹配空白字符,不是\t、\n、\r,空格
print(re.findall('\s','axss\n\tsdf\t\r\t'))
结果:['\n', '\t', '\t', '\r', '\t']

 

3.正则匹配模式
正则匹配模式是用在match、search、findall里面的第三个参数,还有其他的模式,但是一般也用不到,就这两种能用到,别的就不记了
re.I: #忽略大小写
re.M: #多行模式,改变'^'和'$'的行为
re.findall('pattern', 'string',re.I)

(.*):贪婪模式,匹配尽可能多的字符
(.*?)或(.+?):匹配尽可能少的字符,一旦匹配到第一个就不往下走了

posted @ 2017-06-23 20:28  红尘心  阅读(1219)  评论(0编辑  收藏  举报