sys模块是与Python解释器交互的一个接口node
os模块是与操做系统交互的一个接口python
re模块的使用过程c++
# 导入re模块 import re # 使用match方法进行匹配操做 result = re.match(正则表达式,要匹配的字符串) # 若是上一步匹配到数据的话,可使用group方法来提取数据 result.group()
匹配单个字符正则表达式
字符 | 功能 |
---|---|
. | 匹配任意1个字符(除了\n) |
[ ] | 匹配[ ]中列举的字符 |
\d | 匹配数字,即0-9 |
\D | 匹配非数字,即不是数字 |
\s | 匹配空白,即 空格,tab键 |
\S | 匹配非空白 |
\w | 匹配单词字符,即a-z、A-Z、0-九、_ |
\W | 匹配非单词字符 |
匹配多个字符shell
字符 | 功能 |
---|---|
* | 匹配前一个字符出现0次或者无限次,便可有可无 |
+ | 匹配前一个字符出现1次或者无限次,即至少有1次 |
? | 匹配前一个字符出现1次或者0次,即要么有1次,要么没有 |
{m} | 匹配前一个字符出现m次 |
{m,n} | 匹配前一个字符出现从m到n次 |
匹配开头或结尾编程
字符 | 功能 |
---|---|
^ | 匹配字符串开头 |
$ | 匹配字符串结尾 |
匹配分组json
字符 | 功能 |
---|---|
| | 匹配左右任意一个表达式 |
(ab) | 将括号中字符做为一个分组 |
\num | 引用分组num匹配到的字符串 |
(?P<name>) | 分组起别名 |
(?P=name) | 引用别名为name分组匹配到的字符串 |
match 仅仅查找第一个位置,若是找不到,返回Nonewindows
import re result = re.match("kernel","kernel.cn") result.group()result = re.match("kernel","kernel.cn") result.group() # kernel
serach 仅仅返回一个结果bash
import re ret = re.search(r"\d+", "阅读次数为 9999") ret.group() # 9999
findall 返回最多能匹配的个数app
import re ret = re.findall(r"\d+", "python = 9999, c = 7890, c++ = 12345") print(ret) # ['9999', '7890', '12345']
sub 将匹配到的数据进行替换
import re ret = re.sub(r"\d+", '998', "python = 997") print(ret) # Python = 998
贪婪和非贪婪
正则表达式模式中使用到通配字,那它在从左到右的顺序求值时,会尽可能抓取知足匹配最长字符串,在咱们上面的例子里面,+会从字符串的启始处抓取知足模式的最长字符,其中包括咱们想获得的第一个整型字段的中的大部分,\d+只需一位字符就能够匹配,而+则匹配了从字符串起始符合规则的全部字符,解决方式就是非贪婪操做符?,这个操做符能够用在*、+、?的后面,要求正则匹配的越少越好
r的做用
Python中字符串前面加上 r 表示原生字符串,与大多数编程语言相同,正则表达式里使用"\"做为转义字符,这就可能形成反斜杠困扰,假如你须要匹配文本中的字符"\",那么使用编程语言表示的正则表达式里将须要4个反斜杠"\":前两个和后两个分别用于在编程语言里转义成反斜杠,转换成两个反斜杠后再在正则表达式里转义成一个反斜杠,Python里的原生字符串很好地解决了这个问题,有了原生字符串,你不再用担忧是否是漏写了反斜杠,写出来的表达式也更直
时间处理模块
time模块的几种转换方式
时间戳转换为结构化时间
结构化时间转化为时间戳
结构化时间转化为字符串时间
字符串时间转化为结构化时间
日期处理模块
只能适用于Python的基本数据类型,跨语言
适用于Python的全部数据类型,可是只针对Python
日志处理模块
日志的级别
默认状况下Python的logging模块将日志打印到了标准输出中,且只显示了大于等于WARNING级别的日志,这说明默认的日志级别设置为WARNING(日志级别等级CRITICAL > ERROR > WARNING > INFO > DEBUG)
日志的配置
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')
配置参数
logger对象配置
logger = logging.getLogger('kernel') # 建立logging对象 logger.setLevel(logging.DEBUG) # 指定全局被处理消息级别(全局处理消息级别要高于或等于局部消息处理级别) ch = logging.StreamHandler() # 屏幕流 ch.setLevel(logging.DEBUG) # 指定局部被处理消息级别 fh = logging.FileHandler("access.log") # 文件流 fh.setLevel(logging.WARNING) # 指定局部被处理消息级别 formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') # 建立时间格式 ch.setFormatter(formatter) # 设置屏幕流时间格式 fh.setFormatter(formatter) # 设置文本流时间格式 logger.addHandler(ch) # 将屏幕流对象添加到logger中 logger.addHandler(fh) # 将文本流对象添加到logger中 logger.debug('debug message') logger.info('info message') logger.warn('warn message') logger.error('error message') logger.critical('critical message')
加密模块
obj = hashlib.md5() # 建立hashlib对象 obj = hashlib.md5(bytes('kernel',encoding='utf-8')) # 建立hashlib对象并加言 obj.update(bytes('hello',encoding='utf-8')) # 加密 ret = obj.hexdigest() # 获取密文
操纵配置文件模块
import configparser cfg = configparser.ConfigParser() # 建立configparser对象 cfg.read('conf',encoding='utf-8') # 读取配置文件 secs = cfg.sections() # 获取全部节点 print(secs) options = cfg.options(secs[0]) # 获取指定节点的全部key print(options) item = cfg.items(secs[0]) # 获取指定节点的键值对组合 print(item) val = cfg.get(secs[0],options[0]) # 获取指定节点下的指定key的值 print(val) sec = cfg.remove_section(secs[0]) # 删除指定节点 cfg.write(open('conf','w')) print(sec) sec = cfg.has_section('jiedian1') # 检查是否存在该节点 print(sec) sec = cfg.add_section('jiedian1') # 添加该节点 cfg.write(open('conf','w')) print(sec) cfg.set(secs[0],options[0],'111') # 修改指定节点下指定key的值 cfg.write(open('conf','w')) cfg.remove_option(secs[0],options[0]) # 删除指定节点下指定键值对 cfg.write(open('conf','w'))
from xml.etree import ElementTree as ET from xml.dom import minidom # 修改XML """ 解析XML的方式有两种 1.解析字符串方式 将字符串解析成XML对象,root代指XML文件的根节点 str_xml = open('xo.xml', 'r').read() root = ET.XML(str_xml) 2.解析文件方式 获取xml文件的根节点 tree = ET.parse("xo.xml") root = tree.getroot() """ # 遍历XML的全部内容 et = ET.parse('conf.xml') root = et.getroot() # 获取根节点 print(root) print(root.tag) # 顶层标签 for child in root: # 遍历XML文档的第二层 print(' ' + child.tag,child.attrib) # 第二层节点的标签名和标签属性 for i in child: # 遍历XML文档的第三层 print(' ' + i.tag,i.attrib) # 第三层节点的标签名和标签属性 print(' ' + str(i.text)) # 第三层节点的属性 # 遍历XML的指定节点 for node in root.iter('year'): # 遍历XML的全部year节点 print(node.tag, node.text) # 节点的标签名称和内容 # 节点的标签名称和内容并修改节点内容 for node in root.iter('year'): # 遍历XML的全部year节点 print(node.tag, node.text) # 节点的标签名称和内容 new_year = int(node.text) + 1 # 将year节点的内容增长1 node.text = str(new_year) node.set('name', 'kernel') # 设置属性和值 node.set('age', '18') del node.attrib['name'] # 删除属性 # 删除节点 for country in root.findall('country'): # 遍历data下的全部country节点 rank = int(country.find('rank').text) # 获取每个country节点下rank节点的内容 if rank > 50: root.remove(country) # 删除指定country节点 """ 保存XML文件的方式也有两种 1.解析字符串方式 tree = ET.ElementTree(root) tree.write("newnew.xml", encoding='utf-8') 2.解析文件方式 tree.write("new.xml",encoding='utf-8') """ # 建立XML文件 # 方式一 root = ET.Element("famliy") son1 = ET.Element('son', {'name': '大儿子'}) # 建立大儿子节点 son2 = ET.Element('son', {"name": '二儿子'}) # 建立二儿子节点 grandson1 = ET.Element('grandson', {'name': '大孙子'}) # 在大儿子中建立两个孙子 grandson2 = ET.Element('grandson', {'name': '二孙子'}) son1.append(grandson1) # 将孙子添加到儿子节点中 son1.append(grandson2) root.append(son1) # 把儿子添加到根节点中 root.append(son1) tree = ET.ElementTree(root) tree.write('oooo.xml',encoding='utf-8', short_empty_elements=False) # 方式二 root = ET.Element("famliy") son1 = root.makeelement('son', {'name': '大儿子'}) # 建立大儿子节点 son2 = root.makeelement('son', {"name": '二儿子'}) # 建立二儿子节点 grandson1 = root.makeelement('grandson', {'name': '大孙子'}) # 在大儿子中建立两个孙子 grandson2 = root.makeelement('grandson', {'name': '二孙子'}) son1.append(grandson1) # 将孙子添加到儿子节点中 son1.append(grandson2) root.append(son1) # 把儿子添加到根节点中 root.append(son1) tree = ET.ElementTree(root) tree.write('oooo.xml',encoding='utf-8', short_empty_elements=False) # 方式三 root = ET.Element("famliy") son1 = root.SubElement('son', {'name': '大儿子'}) # 建立大儿子节点 son2 = root.SubElement('son', {"name": '二儿子'}) # 建立二儿子节点 grandson1 = root.SubElement('grandson', {'name': '大孙子'}) # 在大儿子中建立两个孙子 grandson2 = root.SubElement('grandson', {'name': '二孙子'}) son1.append(grandson1) # 将孙子添加到儿子节点中 son1.append(grandson2) root.append(son1) # 把儿子添加到根节点中 root.append(son1) tree = ET.ElementTree(root) tree.write('oooo.xml',encoding='utf-8', short_empty_elements=False) # short_empty_elements=False 表示控制元素的格式若是值为False,没有内容,它们是做为一个单独闭合的标签,不然它们会以一对的形式发射开始/结束标记 # 方式四 原生保存的XML时默认无缩进,若是想要设置缩进的话,须要修改保存方式 def prettify(elem): """将节点转换成字符串,并添加缩进。 """ rough_string = ET.tostring(elem, 'utf-8') reparsed = minidom.parseString(rough_string) return reparsed.toprettyxml(indent="\t") root = ET.Element("famliy") son1 = ET.Element('son', {'name': '大儿子'}) # 建立大儿子节点 son2 = ET.Element('son', {"name": '二儿子'}) # 建立二儿子节点 grandson1 = ET.Element('grandson', {'name': '大孙子'}) # 在大儿子中建立两个孙子 grandson2 = ET.Element('grandson', {'name': '二孙子'}) son1.append(grandson1) # 将孙子添加到儿子节点中 son1.append(grandson2) root.append(son1) # 把儿子添加到根节点中 root.append(son1) raw_str = prettify(root) f = open("xxxo.xml",'w',encoding='utf-8') f.write(raw_str) f.close()
执行系统命令模块
call 执行命令,返回状态码
check_call 执行命令,若是执行状态码是 0 ,则返回0,不然抛异常
check_output 执行命令,若是状态码是 0 ,则返回执行结果,不然抛异常
subprocess.Popen(...) 用于执行复杂的系统命令
import subprocess """ 终端输入的命令分为两种: 输入便可获得输出,如:ifconfig 输入进行某环境,依赖再输入,如:python """ # 执行普通命令 ret1 = subprocess.Popen(["mkdir","t1"]) ret2 = subprocess.Popen("mkdir t2", shell=True) # 在指定目录上建立文件夹 obj = subprocess.Popen("mkdir t3", shell=True, cwd='/home/dev',) # 依赖环境的命令 obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True) obj.stdin.write("print(1)\n") obj.stdin.write("print(2)") out_error_list = obj.communicate() print(out_error_list) obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True) out_error_list = obj.communicate('print("hello")') print(out_error_list)