模块的概念
一个python文件就是一个模块(module)
模块分为3中:python标准库、第三方模块、应用程序自定义模块
模块的导入
1.import 语句
import 模块名
2.from 模块名 import *(不推荐,有可能会导致函数重名引发的一系列问题)
3.from 模块名 import 函数名
4.导入模块时,取的是当前执行文件的绝对路径,如果导入的模块与当前执行文件不在一个路径下,则报错
包(package)
为了避免模块名冲突,Python又引入了按目录来组织模块的方法,称为包(Package)

if __name__ == '__main__'
在执行文件中__name__==__main__
在调用文件中__name__=='调用文件的路径'
因此如果文件中某些函数可以被调用,但是某些程序不想被调用,可以在不想被调用的函数前加上 if __name__=='__main__'。调试代码常用到。
常用模块
1.time模块
python中有3种表达时间的方式
timestamp:时间戳(通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量。我们运行“type(time.time())”,返回的是float类型。)
format string:字符串时间
struct_time:结构化时间(struct_time元组共有9个元素共九个元素:(年,月,日,时,分,秒,一年中第几周,一年中第几天,夏令时))

import time
print(time.time()) #时间戳 1568354974.5475204秒
t=time.localtime() #结构化时间,当地时间
print(t)
#time.struct_time(tm_year=2019, tm_mon=9, tm_mday=13, tm_hour=14,
# tm_min=9, tm_sec=34, tm_wday=4, tm_yday=256, tm_isdst=0)
print(t.tm_year) #获取年份
t1=time.gmtime() #结构化时间,UTC时间
#结构化时间转换成时间戳
print(time.mktime(time.localtime()))
#结构化时间转换成字符串时间
print(time.strftime('%Y-%m-%d %X',time.localtime())) #%X 表示时分秒 2019-09-13 14:31:26
print(time.strftime('%Y%m%d %X',time.localtime())) #20190913 14:31:26
#字符串时间转换成结构化时间
print(time.strptime('2019:09:13:14:35:40','%Y:%m:%d:%X'))
print(time.asctime()) #Fri Sep 13 14:39:11 2019 固定格式的字符串时间
print(time.ctime()) #Fri Sep 13 14:39:11 2019
print(time.ctime(1568366797)) #Fri Sep 13 17:26:37 2019
import datetime
print(datetime.datetime.now()) #2019-09-13 14:46:29.546649
2.random模块
import random
random.random() #随机数,浮点数
random.randint(1,3) #[1,3]
random.randrange(1,3) #[1,3)
random.randrange(1,100,2) # 生成从1到100的间隔为2的随机整数
random.choice([1,'22',[1,2],'ss']) #随机取列表中的一个值
random.sample([1,'22',[1,2],'ss'],2) #随机取列表中的2个值
random.uniform(1,3) #1-3之间的一个浮点数
ret5=[1,'22',[1,2],'ss']
random.shuffle(ret5) #打乱列表顺序
print(ret5)
#验证码
def v_code():
code=''
for i in range(5):
num=random.randint(0,9)
alf=chr(random.randint(65,122))
ret=str(random.choice([num,alf]))
code=code+ret
return code
3.os模块
os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径
os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd
os.curdir 返回当前目录: ('.')
os.pardir 获取当前目录的父目录字符串名:('..')
os.makedirs('dirname1/dirname2') 可生成多层递归目录
os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
os.mkdir('dirname') 生成单级目录;相当于shell中mkdir dirname
os.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
os.remove() 删除一个文件
os.rename("oldname","newname") 重命名文件/目录
os.stat('path/filename') 获取文件/目录信息
os.sep 输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/"
os.linesep 输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n"
os.pathsep 输出用于分割文件路径的字符串 win下为;,Linux下为:
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.makedirs('name1/name2') #当前目录下,生成多层递归目录
os.mkdir('name3') #当前目录下,生成单级目录
os.removedirs('name3')
os.removedirs('name1/name2') #若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
os.rmdir('name3') #删除单级空目录,若目录不为空则无法删除,报错
os.listdir('test1') #列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
os.remove() #删除一个文件
os.rename("oldname","newname") #重命名文件/目录
a=r'C:\Users\李金萍\PycharmProjects'
b='untitled\mypython\day21'
# os.path.join()将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
print(os.path.join(a,b)) #--》C:\Users\李金萍\PycharmProjects\untitled\mypython\day21
print(os.path.join(b,a)) #--》C:\Users\李金萍\PycharmProjects
4.sys模块
sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
sys.platform 返回操作系统平台名称
sys.version 获取Python解释程序的版本信息
sys.exit(n) 退出程序,正常退出时exit(0)
sys.argv 命令行参数List,第一个元素是程序本身路径
import sys print(sys.path) # [ # 'C:\\Users\\李金萍\\PycharmProjects\\untitled\\mypython', # 'C:\\Users\\李金萍\\PycharmProjects\\untitled', # 'C:\\Program Files\\Python35\\python35.zip', # 'C:\\Program Files\\Python35\\DLLs', # 'C:\\Program Files\\Python35\\lib', # 'C:\\Program Files\\Python35', # 'C:\\Program Files\\Python35\\lib\\site-packages' # ] print(sys.platform) #win32 print(sys.version) #3.5.1 (v3.5.1:37a07cee5969, Dec 6 2015, 01:54:25) [MSC v.1900 64 bit (AMD64)]
# sys.argv[]就是一个从程序外部获取参数的桥梁,得到的是一个列表,而列表第一个元素就是程序本身,随后依次是外部给予的参数 #当前文件:sys模块.py import sys ret=sys.argv[1] print(ret) #C:/Users/李金萍/PycharmProjects/untitled/mypython/sys模块.py
5.json模块
把对象(变量)从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling
序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上
反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即unpickling
要在不同的编程语言之间传递对象,就必须把对象序列化为标准格式,比如XML,但更好的方法是序列化为JSON,因为JSON表示出来就是一个字符串,可以被所有语言读取,也可以方便地存储到磁盘或者通过网络传输。JSON不仅是标准格式,并且比XML更快,而且可以直接在Web页面中读取,非常方便。
JSON表示的对象就是标准的JavaScript语言的对象,JSON和Python内置的数据类型对应如下:

import json
#dumps
dic={'name':'alex'}
dic_str=json.dumps(dic) #序列化,转换成json字符串 ,单引号都转换为双引号 '{"name": "alex"}'
f=open('new_hello','w')
f.write(dic_str)
#loads
f_read=open('new_hello','r')
data=json.loads(f_read.read()) #反序列化,得到原始的字典 {'name': 'alex'}
print(data['name']) #alex
#dump
dic={'name':'alex'}
f=open('new_hello1','w')
json.dump(dic,f) #用于文件处理,相当于 dic_str=json.dumps(dic) f.write(dic_str)
# dic_str=json.dumps(dic)
# f.write(dic_str)
#load
f_read=open('new_hello1','r')
data=json.load(f_read) #用于文件处理
print(data)
6.xml模块
xml是实现不同语言或程序之间进行数据交换的协议
#xml_lesson
<data>
<country name="Liechtenstein">
<rank updated="yes">2</rank>
<year>2008</year>
<gdppc>141100</gdppc>
<neighbor name="Austria" direction="E"/>
<neighbor name="Switzerland" direction="W"/>
</country>
</data>
#contry下的tag:
#rank 属性(attrib):updated="yes" text:2
#year 无属性,text:2008
#gdppc 无属性,text:2008
#neighbor 两个属性,无文本
import xml.etree.ElementTree as ET
tree=ET.parse('xml_lesson')
root=tree.getroot()
print(root) #<Element 'data' at 0x00000190D2F7EE08>
for i in root:
print(i)
# <Element 'data' at 0x00000217D7B9E5E8>
# <Element 'country' at 0x00000217D7D5BF48>
#遍历xml文档
import xml.etree.ElementTree as ET
tree=ET.parse('xml_lesson')
root=tree.getroot()
for child in root:
print(child.tag, child.attrib)
for i in child:
print(i.tag,i.attrib,i.text)
#country {'name': 'Liechtenstein'}
# rank {'updated': 'yes'} 2
# year {} 2008
# gdppc {} 141100
# neighbor {'name': 'Austria', 'direction': 'E'} None
# neighbor {'name': 'Switzerland', 'direction': 'W'} None
#只遍历某个节点
import xml.etree.ElementTree
tree=xml.etree.ElementTree.parse('xml_lesson')
root=tree.getroot()
for node in root.iter('year'):
print(node.tag,node.text)
#year 2008
for node in root.iter('neighbor'):
print(node.tag,node.attrib)
#neighbor {'name': 'Austria', 'direction': 'E'}
# neighbor {'name': 'Switzerland', 'direction': 'W'}
#修改
import xml.etree.ElementTree as ET
tree=ET.parse('xml_lesson')
root=tree.getroot()
for i in root.iter('year'):
new_year=int(i.text)+3
i.text=str(new_year)
i.set('updated','yes') #增加了一个updated属性,属性值为yes
tree.write('xml_lesson')
#xml_lesson1
<?xml version="1.0"?>
<data>
<country name="Liechtenstein">
<rank updated="yes">2</rank>
<year>2008</year>
<gdppc>141100</gdppc>
<neighbor name="Austria" direction="E"/>
<neighbor name="Switzerland" direction="W"/>
</country>
<country name="Singapore">
<rank updated="yes">5</rank>
<year>2011</year>
<gdppc>59900</gdppc>
<neighbor name="Malaysia" direction="N"/>
</country>
<country name="Panama">
<rank updated="yes">69</rank>
<year>2011</year>
<gdppc>13600</gdppc>
<neighbor name="Costa Rica" direction="W"/>
<neighbor name="Colombia" direction="E"/>
</country>
</data>
#删除
import xml.etree.ElementTree as ET
tree=ET.parse('xml_lesson1')
root=tree.getroot()
for country in root.findall('country'): #findall
rank=int(country.find('rank').text) #find
if rank > 50:
root.remove(country) #remove
tree.write('output.xml')
#创建XML文档
import xml.etree.ElementTree as ET
new_xml=ET.Element('namelist') #创建根节点
name=ET.SubElement(new_xml,'name',attrib={"enrolled":"yes"}) #创建子节点 SubElement(上一级tag,自身tag,属性)
name.text='alice'
age=ET.SubElement(name,'age',attrib={"checked":"no"})
sex = ET.SubElement(name,"sex")
sex.text = '33'
name2 = ET.SubElement(new_xml,"name",attrib={"enrolled":"no"})
age = ET.SubElement(name2,"age")
age.text = '19'
et = ET.ElementTree(new_xml) #生成文档对象
et.write("test916.xml", encoding="utf-8",xml_declaration=True)
ET.dump(new_xml) #打印生成的格式
#生成的文档
<?xml version='1.0' encoding='utf-8'?>
<namelist>
<name enrolled="yes">alice
<age checked="no"/>
<sex>33</sex>
</name>
<name enrolled="no">
<age>19</age>
</name>
</namelist>
7.logging模块
import logging
logging.debug('debug message')
logging.info('info message')
logging.warning('warning message')
logging.error('error message')
logging.critical('critical message')
#默认打印warming级别及以上的日志
# WARNING:root:warning message
# ERROR:root:error message
# CRITICAL:root:critical message
#设置打印的形式
logging.basicConfig(
level=logging.DEBUG,
filename='logger.log',
filemode='w',
format='%(asctime)s %(filename)s [%(lineno)d] %(message)s'
)
# level:设置打印DEBUG级别及以上的日志 filename:将日志打印(追加)到logger.log文件中 filemode:设置打印模式,w:清空重新写入
logging.debug('debug message')
logging.info('info message')
logging.warning('warning message')
logging.error('error message')
logging.critical('critical messag')
#logger.log文件 2019-09-16 15:20:38,383 logging模块.py [38] debug message 2019-09-16 15:20:38,383 logging模块.py [39] info message 2019-09-16 15:20:38,383 logging模块.py [40] warning message 2019-09-16 15:20:38,383 logging模块.py [41] error message 2019-09-16 15:20:38,383 logging模块.py [42] critical messag
format参数中可能用到的格式化串: %(name)s Logger的名字 %(levelno)s 数字形式的日志级别 %(levelname)s 文本形式的日志级别 %(pathname)s 调用日志输出函数的模块的完整路径名,可能没有 %(filename)s 调用日志输出函数的模块的文件名 %(module)s 调用日志输出函数的模块名 %(funcName)s 调用日志输出函数的函数名 %(lineno)d 调用日志输出函数的语句所在的代码行 %(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示 %(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数 %(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒 %(thread)d 线程ID。可能没有 %(threadName)s 线程名。可能没有 %(process)d 进程ID。可能没有 %(message)s用户输出的消息
#同时在屏幕和文件中打印日志
logger=logging.getLogger() #不填写默认root用户,root为mylogger的父节点
logger1=logging.getLogger('mylogger')
fh=logging.FileHandler('test.log')
ch=logging.StreamHandler()
fm=logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger.setLevel('ERROR')
logger1.setLevel('WARNING')
fh.setFormatter(fm)
ch.setFormatter(fm)
logger.addHandler(fh)
logger.addHandler(ch)
logger1.addHandler(fh)
logger1.addHandler(ch)
logger.debug('hahaha')
logger.info('hahaha')
logger.warning('hahaha')
logger.error('hahaha')
logger.critical('hahaha')
logger1.debug('hello world')
logger1.info('hello world')
logger1.warning('hello world')
logger1.error('hello world')
logger1.critical('hello world')
#mylogger打印完,向上找到父节点,判断父节点是否也有输出,如果是,则再打印一份,所以这里的结果mylogger打印了两份
# 2019-09-16 15:28:59,255 - root - ERROR - hahaha
# 2019-09-16 15:28:59,270 - root - CRITICAL - hahaha
# 2019-09-16 15:28:59,270 - mylogger - WARNING - hello world
# 2019-09-16 15:28:59,270 - mylogger - WARNING - hello world
# 2019-09-16 15:28:59,270 - mylogger - ERROR - hello world
# 2019-09-16 15:28:59,270 - mylogger - ERROR - hello world
# 2019-09-16 15:28:59,270 - mylogger - CRITICAL - hello world
# 2019-09-16 15:28:59,270 - mylogger - CRITICAL - hello world
8.configparse模块
#创建配置文件
import configparser
config=configparser.ConfigParser()
config["DEFAULT"] = {'ServerAliveInterval': '45',
'Compression': 'yes',
'CompressionLevel': '9'}
config['bitbucket.org'] = {}
config['bitbucket.org']['User'] = 'hg'
config['topsecret.server.com'] = {}
topsecret = config['topsecret.server.com']
topsecret['Host Port'] = '50022'
topsecret['ForwardX11'] = 'no'
config['DEFAULT']['ForwardX11'] = 'yes'
with open('example.ini', 'w') as configfile:
config.write(configfile)
#生成的example.ini文件 [DEFAULT] compression = yes compressionlevel = 9 serveraliveinterval = 45 forwardx11 = yes [bitbucket.org] user = hg [topsecret.server.com] host port = 50022 forwardx11 = no
#读取example.ini文件
import configparser
config=configparser.ConfigParser()
config.read('example.ini')
print(config.sections()) #取出块 ['bitbucket.org', 'topsecret.server.com']
print('bite.com' in config) #False
print(config['DEFAULT']['Compression']) #yes
print(config['bitbucket.org']['User']) #hg
for key in config['bitbucket.org']:
print(key)
# 遍历结果,除了遍历出自身的key,也会把default下面的key也遍历出来
# user
# compression
# compressionlevel
# serveraliveinterval
# forwardx11
print(config.options('bitbucket.org'))
#取出键名
#['user', 'compression', 'compressionlevel', 'serveraliveinterval', 'forwardx11']
print(config.items('bitbucket.org'))
#取出键值对
#[('compression', 'yes'), ('compressionlevel', '9'), ('serveraliveinterval', '45'), ('forwardx11', 'yes'), ('user', 'hg')]
print(config.get('bitbucket.org','compression'))
#yes
#新增/删除/修改操作
import configparser
config=configparser.ConfigParser()
config.read('i.cfg')
config.add_section('yuan1') #块
config.set('yuan1','k1','123') #块 键 值
config.set('yuan1','k2','123333')
config.set('yuan1','k3','1234')
config.add_section('yuan2') #块
config.set('yuan2','k1','www') #块 键 值
config.set('yuan2','k2','www')
config.set('bitbucket.org','k3','www')
config.set('bitbucket.org','user','pplee')
config.remove_section('topsecret.server.com') #删除块
config.remove_option('bitbucket.org','user') #删除块下面的键值对
config.write(open('i.cfg',"w"))
9.hashlib模块
用于加密的相关操作
import hashlib
m=hashlib.md5() #md5加密
m1=hashlib.md5('qaz#$'.encode('utf-8'))
sha=hashlib.sha256() #sha256加密
passwd='wss223$%'
m.update(passwd.encode('utf-8'))
m1.update(passwd.encode('utf-8'))
sha.update(passwd.encode('utf-8'))
print(m.hexdigest()) #f16a662126c91bb312419d08f5e8726b
print(m1.hexdigest()) #f100d2f5a559b0c6e8e85203db337d31
print(sha.hexdigest()) #584968ed709045d8093888eea0906e46bcad6780d9e10dda8b72b5434fa013a9
10.re模块
正则表达式:re
元字符:. ^ $ * + ? { } [ ] | ( ) \
import re
#元之符 . ^ $
ret='sadfdgjsadfadlkslle'
print(re.findall('s..e',ret)) #-->['slle']
print(re.findall('s...d',ret)) #-->['sadfd']
print(re.findall('s..f',ret)) #-->['sadf', 'sadf']
print(re.findall('^s..f',ret)) #-->['sadf'] ^表示只能在字符串开头进行匹配
print(re.findall('s..f$',ret)) #-->[] $表示只能在字符串结尾进行匹配
print(re.findall('l.e$',ret)) #-->['lle'] $表示只能在字符串结尾进行匹配
#元之符 * + ? {}
# *:匹配0到无穷次 +:匹配1到无穷次 都属于贪婪匹配
# ?:匹配0到1次 {}:{0,}==* {1,}==+ {0,1}==? {6}重复6次 {1,6}重复1-6次
print(re.findall('d*','dfdddddddddddddddl')) #-->['d', '', 'ddddddddddddddd', '', '']
print(re.findall('d+','dfdddddddddddddddl')) #-->['d', 'ddddddddddddddd']
print(re.findall('alick*','sdsdalice')) #-->['alic']
print(re.findall('alick+','sdsdalice')) #-->[]
print(re.findall('alem?','asdhfalexxx')) #-->['ale']
print(re.findall('alex?','asdhfalexxx')) #-->['alex']
print(re.findall('alex{2}','asdhfalexxx')) #-->['alexx']
print(re.findall('alex{3}','asdhfalexxx')) #-->['alexxx']
print(re.findall('alex{0,2}','asdhfalexxx')) #-->['alexx']
#元之符 字符集[]
#在字符集里有功能的符号: - ^ \
print(re.findall('x[y*z.]p','xyphhx*pssxzpx.p')) #-->['xyp', 'x*p', 'xzp', 'x.p']
print(re.findall('q[a-z]*','qads9fsdkq1')) #-:一段范围 ['qads', 'q']
print(re.findall('q[^a-z]*','qads9fsdkq1')) #^:非的意思 ['q', 'q1']
print(re.findall('\([^()]*\)','12+(34*6-2-5(2-1))')) #\转义 去除特殊功能 ['(2-1)']
# 元之符 转义符\
# 反斜杠后边跟元字符去除特殊功能,比如\.
# 反斜杠后边跟普通字符实现特殊功能,比如\d
# \d 匹配任何十进制数;它相当于类 [0-9]。
# \D 匹配任何非数字字符;它相当于类 [^0-9]
print(re.findall('\d','ka34kj45ll1')) #['3', '4', '4', '5', '1']
print(re.findall('\d+','ka34kj45ll1')) #['34', '45', '1']
print(re.findall('\D','ka34kj45ll1')) #['k', 'a', 'k', 'j', 'l', 'l']
print(re.findall('\D+','ka34kj45ll1')) #['ka', 'kj', 'll']
#\s 匹配任何空白字符
#\S 匹配任何非空白字符
print(re.findall('\s','hello world hhha')) #[' ', ' ', ' ']
print(re.findall('\s+','hello world hhha')) #[' ', ' ']
print(re.findall('\S','hello world')) #['h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd']
print(re.findall('\S+','hello world')) #['hello', 'world']
# \w 匹配任何字母数字字符;它相当于类 [a-zA-Z0-9_]。
# \W 匹配任何非字母数字字符;它相当于类 [^a-zA-Z0-9_]
print(re.findall('\w+','ka34%kj45')) #['ka34', 'kj45']
print(re.findall('\W+','ka34%kj45')) #['%']
#\b 匹配一个特殊字符边界,比如空格 ,&,#等
print(re.findall('i','i am ss list')) #['i', 'i']
print(re.findall('i\b','i am list')) #[] python解释器传给re模块处理时,需要传入\\,re接受才能接受到转义后的\
print(re.findall('i\\b','i am list')) #['i']
print(re.findall(r'i\b','i am list')) #['i'] r表示后面内容不转义

# 元之符 | 或
print(re.findall('ka|b','ckafbc')) #['ka', 'b']
# 元之符 () 分组
print(re.findall('abc*','abccrabcerab')) #['abcc', 'abc', 'ab']
print(re.findall('(abc)','abccrabcerab')) #['abc', 'abc']
print(re.search('(abc)','abccccabc').group()) #search只匹配一个 abc
print(re.search('(?P<name>[a-z]+)','alice34buny45').group()) #alice ?P<>分组的固定格式 name表示分组的组名
print(re.search('(?P<name>[a-z]+)','alice34buny45').group('name')) #alice
print(re.search('(?P<name>[a-z]+)(?P<id>\d+)','alice34buny45').group('id'))
#34 name和id都表示分组的组名,group里面加上组名取出相应的值
#re模块常用方法
print(re.match('a','abc').group()) #search的基础上,在字符串开头进行匹配
print(re.split('[ |]','hello abc|ccc')) #先根据空格分隔,再跟据|分割 ['hello', 'abc', 'ccc']
print(re.split('[ab]','abc')) #先按a分割,分割结果为空和bc,bc再根据b分割,结果为空和c,最终结果为['', '', 'c']
print(re.sub('\d+','A','sdf34kjf4567lksd1')) #根据匹配规则匹配出来的结果替换成A sdfAkjfAlksdA
print(re.sub('\d+','A','sdf34kjf4567lksd1',1)) #只匹配第一个 sdfAkjf4567lksd1
print(re.subn('\d+','A','sdf34kjf4567lksd1')) #('sdfAkjfAlksdA', 3) 打印总共匹配的次数
com=re.compile('\d+') #规则已编译到com中
print(com.findall('asf34adsf8avf890') ) #不用再写规则 ['34', '8', '890']
ret=re.finditer('\d','dsfgerjgergq840rjcfea0r9ffjaergjjg')
print(ret)
#将结果存在迭代器当中,<callable_iterator object at 0x00000203BCE6AB00>
print(next(ret).group()) #8
#re 补充
print(re.findall('www\.(baidu)\.com','www.baidu.com')) #优先取分组里面的结果 ['baidu']
print(re.findall('www\.(?:baidu)\.com','www.baidu.com')) #在分组中加入?: 去掉优先级 ['www.baidu.com']
学习资料来源:
https://www.cnblogs.com/linhaifeng/articles/6379069.html
https://www.cnblogs.com/yuanchenqi/articles/5732581.html