热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python第五周:模块、标准库

模块相关知识:定义:用来从逻辑上组织python代码(变量、函数、类、逻辑:实现一个功能)本质就是以.py结尾

模块相关知识:

定义:用来从逻辑上组织python代码(变量、函数、类、逻辑:实现一个功能)本质就是以.py结尾的python文件(文件名:test.py,对应的模块名:test)

附注:包:是用来从逻辑上组织模块的,本质就是一个目录(必须带有一个_init_.py文件)

导入方法:

(1)import module_name     import module1_name,module2_name

(2)from module_1 import *     from module_1 import m1,m2,m3     from modul_1 import logger as logger_1

import本质(路径搜索和搜索路径):

导入模块的本质就是把python文件解释一遍。要解释该python文件,就要先找到这个模块在哪儿(即这个模块的路径位置)

举例:

(1)import module_1,本质就是把module_1中的所有代码解释了一遍复制给module_1 = (all_code)

         调用方式:module_1.name,module_1.say_hello()

(2)from module_1 import name,本质就是把modul_1中的name变量放到当前位置并执行name = "Mr Wu"

导入包的本质就是解释该包下的_init_.py文件

模块的分类:

a:标准库

b:开源模块

c:自定义模块

标准库:

(1)time和datetime

再python中,通常由这几种方式来表示时间:1)时间戳 2)格式化的时间字符串 3)元组(struc_time)共九个元素。由于python中的时间模块实现主要调用c库,所以各个平台上可能有所不同。

附注:UTC即格林威治天文时间,世界标准时间。再中国为UTC+8,DST即夏令时。

时间戳:通常来说,时间戳表示的是从1970年1月一日00:00:00开始按秒计算的偏移量。我们运行:"type(time.time())",返回的是float类型。返回时间戳方式的函数主要有time(),clock()

元组方式:struct_time元组共有九个元素,返回struct_time的函数主要有gmtime(),localtime(),strftime()。

import time
t = time.time()#获取时间戳
time.localtime(t)#获取UTC+*的struct_time元组
time.gmtime(t)#获取UTC的struct_time元组
strftime(
"格式",struct_time)---->"格式化字符串"
strptime(
"格式化的字符串","格式")---->struct_time
>>>time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()) #%Y:x.tm_year %m:x.tm_mon
"2018-09-25 20:19:34"
>>>time.strptime("2018-09-25 20:19:34","%Y-%m-%d %H:%M:%S")
time.struct_time(tm_year
=2018,tm_mon=9,tm_mday=25,tm_hour=20,tm_min=19,tm_yday=233,tm_isdst=-1)import datetime
datetime.datetime.now()
#获取当前时间:datetime.datetime(2018, 9, 25, 20, 59, 49, 449321)
datetime.datetime.now()+datetime.timedelta(m)
#m天后的时间:2018-09-25+m 21:03:41.081737
datetime.datetime.now()+datetime.timedelta(hours=m)
#m个小时后的时间:2018-09-25 21+m:03:41.081737
datetime.datetime.now()+datetime.timedelta(minutes=m)
#m分钟后的时间:2018-09-25 21:03+m:41.081737
c_time = datetime.datetime.now()
print(c_time.replace(minute=3,hour=2))
#时间替换,2018-09-25 02:03:41.081737

(2)random模块:

print(random.random()) #0.829382#random.random()用于生成一个0到1之间的随机浮点数print(random.uniform(1,10))#random.uniform(n,m)用于生成一个n到m之间的随即浮点数print(random.randint(1,7)) #4#random.randint()的函数原型是:random.randint(a,b),用于生成一个指定范围内的整数。#其中参数a是上限,参数b是下限&#xff0c;生成的随机数:a<&#61;n<&#61;bprint(random.randrange(1,10) #5#random.randrange()的函数原型为:random.randrange([start],stop[,step]),#从指定范围内&#xff0c;按指定基数递增的集合中 获取一个随机数。如:random.randrange(10,100,2),#结果相当于从[10,12,14......,96,98]序列中获取一个随机数#random.randrange(10,100,2)在结果上与random.choice(range(10,100,2))等效print(random.choice("liukuni")) #1#random.choice从序列中获取一个随机元素。#其函数原型为:random.choice(sequence)。参数sequence表示一个有序类型。#这里说明一下&#xff1a;sequence在python中不是一种特定的类型&#xff0c;而是泛指一系列的类型#list、tuple、字符串都属于sequence#下面是使用了choice的一些例子&#xff1a;print(random.choice("学习python")) #print(random.choice(["JGood","List","Dict"]) ) #Listprint(random.choice(("Tuple","List","Dict")) #Listprint(random.sample([1,2,3,4,5],3)) #[1,2,5]#random.sample的函数原型为:random.sample(sequence,k),从指定序列中随机获取指定长度的片段#sample不会修改函数原型print(random.uniform(1,10))#random.uniform(n,m)用于生成一个n到m之间的随即浮点数#洗牌items &#61; [1,2,3,4,5,6,7]print(items) #[1,2,3,4,5,6,7]
random.shuffle(items)print(items) #[1,4,7,2,5,3,6]

&#xff08;3&#xff09;os模块

提供对操作系统进行调用的接口&#xff1a;

os.getcwd()获取当前工作目录&#xff0c;及当前脚本工作的目录路径os.chdir("dirname")改变当前脚本工作目录&#xff0c;相当于shell下cdos.curdir 返回当前目录&#xff1a;(&#39;.&#39;)&#xff08;代表当前目录&#xff09;os.pardir 获取当前目录的父目录的字符串名:(&#39;..&#39;)&#xff08;代表父集目录&#xff09;os.makedirs("dirname1/dirname2") 可生成多层递归目录os.removedirs("dirname1") 若目录为空&#xff0c;则删除&#xff0c;并递归到上一级目录&#xff0c;如若也为空&#xff0c;则删除&#xff0c;依此类推os.mkdir("dirname") 生成单级目录&#xff0c;相当于shell中的mkdir dirnmaeos.rmdir("dirname") 删除单级目录os.listdir("dirname") 列出指定目录下的所有文件和子目录&#xff0c;包括隐藏文件&#xff0c;并以列表方式打印os.remove()删除一个文件os.rename("oldname","newname") 重命名文件/目录os.stat("path/filename") 获取文件/目录信息os.sep 输出操作系统特定的路径分隔符&#xff0c;win下位"\\",Linux下位"\"os.linesep 输出当前平台使用的行终止符&#xff0c;win下为"\r\n",Linux下位"\n"os.pathsep 输出用于分割文件路径的字符串os.name 输出字符串指示当前使用平台&#xff0c;win->"nt",Linux->"posix"os.system("bash command") 运行shell命令&#xff0c;直接显示os.environ 获取系统环境变量os.path.abspath(path) 返回path规范化的绝对路径os.path.spilt(path) 将path分割成目录和文件名二元组返回os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素os.path.basename(path) 返回path最后的文件名。如果path以/或\结尾&#xff0c;那么就会返回空值。即os.path.split(path)的第二个元素os.path.exists(path) 如果path存在&#xff0c;返回True&#xff0c;否则返回Falseos.path.isabs(path) 如果path是绝对路径&#xff0c;返回Trueos.path.isfile(path) 如果path是一个存在的文件&#xff0c;返回True&#xff0c;否则返回Falseos.path.isdir(path) 如果path是一个存在的目录&#xff0c;返回True&#xff0c;否则返回Falseos.path.join(path1[,path2[,......]]) 将多个路径组合后返回&#xff0c;第一个绝对路径之前的参数将被忽略os.path.getatime(path) 返回path所指向的文件或目录的最后存取时间os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间

 &#xff08;4&#xff09;sys模块

#sys.argv,获取命令行参数list&#xff0c;第一个元素是程序本身的路径
print(sys.argv)#[&#39;F:/python学习/projects/s14/day5/练习1.py&#39;]
#
sys.exit(n),退出程序&#xff0c;正常退出是sys.exit(0)
sys.exit(0)
# sys.version,获取python解释程序的版本信息
print(sys.version)#3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:18:55) [MSC v.1900 64 bit (AMD64)]
#
sys.platform&#xff0c;返回操作系统平台名称
print(sys.platform)#win32

&#xff08;5&#xff09;shutil模块

import shutil
#copyfileobj(fsrc,fdst[,length&#61;16*1024]),copy文件内容到另一个文件
f &#61; open("names","r")
f_new
&#61; open("names2","w")
hutil.copyfileobj(f,f_new)
#copyfile(src,dst)&#xff0c;从源src复制到dst中去&#xff0c;当然前提是目标地址时具备可先权限&#xff0c;抛出的异常信息为IOException&#xff0c;
#
如果当前的dst已存在的话就会被覆盖掉
shutil.copyfile("names","names1")
#copymode(src,dst),仅复制权限&#xff0c;不更改文件内容、组、用户
shutil.copymode("names","names2")
#copystat(src,dst),复制所有的状态信息&#xff0c;包括权限&#xff0c;组&#xff0c;用户&#xff0c;时间等
shutil.copystat("names","names2")
#copy( src, dst),复制文件的内容以及权限
shutil.copy("names","names2")
#copy2( src, dst),在copy上的基础上再复制文件所有的状态信息
shutil.copy2("names","names2")
#copytree(src, dst, symlinks&#61;False, ignore&#61;None, copy_function&#61;copy2,
#
ignore_dangling_symlinks&#61;False)&#xff0c;递归的复制文件内容及状态信息
shutil.copytree(r"F:\超级下载器",r"F:\m")
#shutil.rmtree(path, ignore_errors&#61;False, οnerrοr&#61;None)&#xff0c;递归地删除文件
shutil.rmtree(r"F:\m")
#make_archive(base_name, format, root_dir&#61;None, base_dir&#61;None,
#
verbose&#61;0,dry_run&#61;0, owner&#61;None, group&#61;None, logger&#61;None),压缩打包
&#39;&#39;&#39;
base_name&#xff1a;压缩打包后地文件名或路径名
format: 压缩或者打包格式 "zip","tar","bztar" or "gztar"
root_dir: 在哪个目录或者文件打包&#xff08;源文件&#xff09;
&#39;&#39;&#39;
shutil.make_archive(
"make_archive_test","zip",r"F:\a")#默认打包到当前目录下
#shutil.move(src, dst) &#xff0c;递归的移动文件

import shutil
shutil.move("names1","names2")

&#xff08;6&#xff09;zipfile模块

zipfile模块用来做zip格式编码的压缩和解压缩的&#xff0c;zipfile里有两个非常重要的class, 分别是ZipFile和ZipInfo,
在绝大多数的情况下&#xff0c;我们只需要使用这两个class就可以了。
ZipFile是主要的类&#xff0c;用来创建和读取zip文件而ZipInfo是存储的zip文件的每个文件的信息的。

一个ZipInfo对象中包含了压缩包内一个文件的信息&#xff0c;
其中比较常用的是 filename, file_size, header_offset, 分别为文件名&#xff0c;文件大小&#xff0c;文件数据在压缩包中的偏移。

import zipfile
#ZipFile(filename,"w"),创建一个压缩包
zipfile.ZipFile("day5.zip","w")
#把其他的文件压进同一个压缩包
z &#61; zipfile.ZipFile("day5.zip","w")
z.write(r
"F:\a")
z.write(
"I Found You")
#从压缩包里解压缩出一个文件的方法是使用ZipFile的read方法
z &#61; zipfile.ZipFile("day5.zip","r")
print(z.namelist())#[&#39;I Found You&#39;]
print(z.read(z.namelist()[0]).decode(encoding&#61;"gbk"))#输出压缩文件地内容
#
解压缩
z &#61; zipfile.ZipFile("day5.zip","r")
z.extractall()

&#xff08;7&#xff09;shelve模块

shelve模块时一个简单的key-value将内存数据通过文件持久化地模块&#xff0c;可以持久化任何pickle可支持地python数据格式。key必须是字符串

写&#xff1a;

import shelve
d
&#61; shelve.open("shelve_test1")
info
&#61; {"name":"Mr Wu","age":19}
names
&#61; ["Mr Wu","Jing Jiu","Na Yue"]
d[
"a"] &#61; info
d[
"b"] &#61; names
d.close()

读&#xff1a;

d &#61; shelve.open("shelve_test1")
print(d.get("a"))
print(d.get("b"))
d.close()

&#xff08;8&#xff09;xml模块&#xff08;我自己的电脑中还未安装相关模块&#xff08;expat&#xff09;&#xff09;

xml是实现不同语言或程序设计之间进行数据交换地协议&#xff0c;跟json差不多

创建xml:

import xml.etree.ElementTree as ETnew_xml &#61; ET.Element("person_info_list")#生成根节点
person_info &#61; ET.SubElement(new_xml,"personinfo",attrib&#61;{"people":"yes"})
name
&#61; ET.SubElement(person_info,"name")
name.text
&#61; "Mr Wu"
age
&#61; ET.SubElement(person_info,"age")
age.text
&#61; "19"
person_info2
&#61; ET.SubElement(new_xml,"personinfo",attrib&#61;{"people":"no"})
name
&#61; ET.SubElement(person_info2,"name")
name.text
&#61; "Alex"
age
&#61; ET.SubElement(person_info2,"age")
age.text
&#61; "34"
et
&#61; ET.ElementTree(new_xml)#生成文档对象
et.write("xml_test.xml",encoding&#61;"utf-8",xml_declaration&#61;True)

xml version&#61;&#39;1.0&#39; encoding&#61;&#39;utf-8&#39;?>
<person_info_list><personinfo people&#61;"yes"><name>Mr Wuname><age>19age>personinfo><personinfo people&#61;"no"><name>Alexname><age>34age>personinfo>
person_info_list>

xml处理&#xff1a;

#获取根节点
tree &#61; ET.parse("xml_test.xml")
root
&#61; tree.getroot()
tag
&#61; root.tag#根节点的名称
attrib &#61; root.attrib#根节点地属性
print(tag,attrib)
#获取子节点的属性和名称
for child in root:print(child.tag,child.attrib)
#输出为personinfo {"people":"Yes"} personinfo {"people":"No"}
#
获取属性对应的值
for personinfo in root.findall("personinfo"):people &#61; personinfo.get("people")name &#61; personinfo.get("name")print(people,name)
#输出为&#xff1a;"yes" Mr Wu , "No" "Alex"
#
遍历xml文档
for child in root:print(child.tag,child.attrib)for i in child:print(i.tag,i.text,i.attrib)
#只遍历name结点
for node in root.iter("name"):print(node.tag,node.text)

xml修改&#xff1a;

tree &#61; ET.parse("xml_test.xml")
root
&#61; tree.getroot()
#修改
for age in root.iter("age"):new_age &#61; int(age.text)&#43;1age.text &#61; str(new_age)age.set("updated","Yes")
tree.write(
"xml_test1.xml")
#删除
for personinfo in root.findall("personinfo"):age &#61; int(personinfo.find("age").text)if age>50:root.remove(personinfo)
tree.write(
"xml_test2.xml")

&#xff08;9&#xff09;.yaml模块&#xff1a;

暂定&#xff0c;还未开始学习

&#xff08;10&#xff09;.configparser模块

ConfigParser 是Python自带的模块&#xff0c; 用来读写配置文件.

配置文件的格式是&#xff1a; []包含的叫section,    section 下有option&#61;value这样的键值

创建&#xff1a;

import configparser #ConfigParser

config
&#61; configparser.ConfigParser()config["DEFAULT"] &#61; {&#39;ServerAliveInterval&#39;: &#39;45&#39;,&#39;Compression&#39;: &#39;yes&#39;,&#39;CompressionLevel&#39;: &#39;9&#39;}config[&#39;bitbucket.org&#39;] &#61; {}
config[
&#39;bitbucket.org&#39;][&#39;User&#39;] &#61; &#39;hg&#39;config[&#39;topsecret.server.com&#39;] &#61; {}
config[
&#39;topsecret.server.com&#39;][&#39;Host Port&#39;] &#61; &#39;50022&#39; # mutates the parser
config[&#39;topsecret.server.com&#39;][&#39;ForwardX11&#39;] &#61; &#39;no&#39; # same here

config[
&#39;DEFAULT&#39;][&#39;ForwardX11&#39;] &#61; &#39;yes&#39;with open(&#39;example.ini&#39;, &#39;w&#39;) as configfile:config.write(configfile)

[DEFAULT]
compressionlevel
&#61; 9
serveraliveinterval
&#61; 45
compression
&#61; yes
forwardx11
&#61; yes[bitbucket.org]
user
&#61; hg[topsecret.server.com]
host port
&#61; 50022
forwardx11
&#61; no

读、修改&#xff1a;

import configparser
config
&#61; configparser.ConfigParser()
config.read(
"example.ini")print(config.defaults())
#OrderedDict([(&#39;compressionlevel&#39;, &#39;9&#39;), (&#39;serveraliveinterval&#39;, &#39;45&#39;), (&#39;compression&#39;, &#39;yes&#39;), (&#39;forwardx11&#39;, &#39;yes&#39;)])
#
获取所有的section
print(config.sections())#[&#39;bitbucket.org&#39;, &#39;topsecret.server.com&#39;]
#
删除
config.remove_section("bitbucket.org")
with open(
"example.ini","w") as configfile:configfile.write(config)
#获取指定的section&#xff0c;指定的option的值
print(config.get("DEFAULT","forwardx11"))#yes
#
更新指定section, option的值
config.set("DEFAULT","forwardx11","no")
#写入指定section, 增加新option的值
config.set("DEFAULT","name","Mr Wu")
# 添加新的 section
config.add_section("new_section")
config.set(
"new_section","new_optipn","new_value")
config.write(open(
"example.ini","w"))

&#xff08;11&#xff09;hashlib模块

hashlib主要提供字符串加密功能&#xff0c;将md5和sha模块整合在了一起&#xff0c;支持md5,sha1,sha256,sha384,sha512等算法

import hashlib
#hashlib主要提供字符串加密功能&#xff0c;将md5和sha模块整合在了一起&#xff0c;支持md5,sha1,sha224,sha256,sha384,sha512等算法
string &#61; "Mr Wu12345"
#md5
md5 &#61; hashlib.md5()
md5.update(string.encode(
"utf-8"))
res
&#61; md5.hexdigest()
print(res)
#sha256
sha256 &#61; hashlib.sha256()
sha256.update(string.encode(
"utf-8"))
res
&#61; sha256.hexdigest()
print(res)
#sha384
sha384 &#61; hashlib.sha384()
sha384.update(string.encode(
"utf-8"))
res
&#61; sha384.hexdigest()
print(res)
#sha512
sha512 &#61; hashlib.sha512()
sha512.update(string.encode(
"utf-8"))
res
&#61; sha512.hexdigest()
print(res)
#以上实验输出结果为&#xff1a;
&#39;&#39;&#39;
md5:4e41b58bb0be472b6254a5c48d22d6b7
sha256:f6c91cd8153194b6f4da78807367e439bca62ba441faf48f2c5d0f28131c3862
sha384:e39db18a1a59266a1dcc0c710b4be46f4403aab2deeba1d36f5081b1ce8c5eb3c7fee5cea73bd78e41690be9b1113fbc
sha512:126b9738409cd4d20bf2310f9f0559d2434bc9ad9eabcad56a72b9f9ece6955d3c7ec14e5b33f35a8f1f809cb769463fbe5704112531d673c9aab426246e5ee8
&#39;&#39;&#39;
#注意&#xff1a;hashlib加密的字符串类型为二进制编码&#xff0c;直接加密会报如下错误
sha1 &#61; hashlib.sha1()
sha1.update(string)
res
&#61; sha1.hexdigest()
print(res)
#TypeError: Unicode-objects must be encoded before hashing
#
解决方法&#xff1a;
sha1.update(string.encode("utf-8"))
sha1.update(bytes(string,encoding
&#61;"utf-8"))

常用方法&#xff1a;

hash.update(arg)更新哈希对象以字符串参数&#xff0c;注意&#xff1a;如果同一个hash对象反复调用该方法&#xff0c;
则m.update(a),m.update(b),等效于m.update(a&#43;b)

m &#61; hashlib.md5()
m.update(b
"a")
res
&#61; m.hexdigest()
print("第一次a加密",res)
m.update(b
"b")
res
&#61; m.hexdigest()
print("第二次b加密",res)
m1
&#61; hashlib.md5()
m1.update(b
"b")
res
&#61; m1.hexdigest()
print("b单独加密",res)
m2
&#61; hashlib.md5()
m2.update(b
"ab")
res
&#61; m2.hexdigest()
print("ab单独加密",res)
#以上实验结果
&#39;&#39;&#39;
第一次a加密 0cc175b9c0f1b6a831c399e269772661
第二次b加密 187ef4436122d1cc2f40dc2b92f0eba0
b单独加密 92eb5ffee6ae2fec3ad71c777531578f
ab单独加密 187ef4436122d1cc2f40dc2b92f0eba0
&#39;&#39;&#39;

   hash.digest()返回摘要&#xff0c;作为二进制数据字符串值

   hash.hexdigest()返回摘要&#xff0c;作为二进制数据字符串值

   hash.copy()复制

高级加密&#xff1a;

以上算法虽然厉害&#xff0c;但存在缺陷&#xff0c;即&#xff1a;可以通过撞库反解。所以有必要对加密算法中添加自定义的key再来做加密

import hashlib
low
&#61; hashlib.md5()
low.update(b
"Mr Wu")
res
&#61; low.hexdigest()
print("普通加密:",res)high &#61; hashlib.md5(b"12345")
high.update(b
"Mr Wu")
res
&#61; high.hexdigest()
print("高级加密:",res)
#以上实验的结果
&#39;&#39;&#39;
普通加密: 72420ab5c6befd72f79850d4a896d0a7
高级加密: f02884ca74913c058473420eb3a45e34
&#39;&#39;&#39;

 &#xff08;12&#xff09;正则表达式

import re
#2.1开始使用re
#
将正则表达式编译成pattern对象
pattern &#61; re.compile(r"hello")
#使用pattern匹配文本&#xff0c;获得匹配结果&#xff0c;无法匹配时将返回None
match &#61; pattern.match("hello world")
if match:#使用match获得分组信息print(match.group())
#输出&#xff1a;hello
#
简写方法&#xff1a;
m &#61; re.match(r"hello","hello world!")
print(m.group())#hello
#
2.2match
#
Match对象是一次匹配的结果&#xff0c;包含了很多关于此次匹配的信息&#xff0c;可以使用Match提供的可读属性或方法来获取这些信息。
m &#61; re.match(r"(\w&#43;) (\w&#43;)(?P.*)","hello world!")
print("m.string:",m.string)
print("m.re:",m.re)
print("m.pos:",m.pos)
print("m.endpos:",m.endpos)
print("m.lastindex:",m.lastindex)
print("m.lastgroup:",m.lastgroup)print("m.group(1,2):",m.group(1,2))
print("m.groups():",m.groups())
print("m.groupdict():",m.groupdict())
print("m.start(2):",m.start(2))
print("m.end(2):",m.end(2))
print("m.span(2):",m.span(2))
print("m.expand():",m.expand(r&#39;\2 \1\3&#39;))
#以上实验的输出结果&#xff1a;
&#39;&#39;&#39;
m.string: hello world!
m.re: re.compile(&#39;(\\w&#43;) (\\w&#43;)(?P.*)&#39;)
m.pos: 0
m.endpos: 12
m.lastindex: 3
m.lastgroup: sign
m.group(1,2): (&#39;hello&#39;, &#39;world&#39;)
m.groups(): (&#39;hello&#39;, &#39;world&#39;, &#39;!&#39;)
m.groupdict(): {&#39;sign&#39;: &#39;!&#39;}
m.start(2): 6
m.end(2): 11
m.span(2): (6, 11)
m.expand(): world hello!
&#39;&#39;&#39;
#2.3pattern
p &#61; re.compile(r&#39;(\w&#43;) (\w&#43;)(?P.*)&#39;,re.DOTALL)
print("p.pattern:",p.pattern)
print("p.flags:",p.flags)
print("p.groups:",p.groups)
print("p.groupindex",p.groupindex)
#&#61;&#61;&#61;&#61;&#61;&#61;output&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;
&#39;&#39;&#39;
p.pattern: (\w&#43;) (\w&#43;)(?P.*)
p.flags: 48
p.groups: 3
p.groupindex {&#39;sign&#39;: 3}
&#39;&#39;&#39;
#实例方法[re模块方法]
pattern &#61; re.compile(r&#39;world&#39;)
match
&#61; pattern.match("hello world")
print(match)#None
match &#61; pattern.search("hello world")
print(match.group())#world
p &#61; re.compile(r&#39;\d&#43;&#39;)
print(p.split(&#39;sad219bxckjb39dksb3&#39;))
#------output------
#
[&#39;sad&#39;, &#39;bxckjb&#39;, &#39;dksb&#39;, &#39;&#39;]
print(p.findall("dsakh2139bsdk392fhs3kj3h3"))
#------output------
#
[&#39;2139&#39;, &#39;392&#39;, &#39;3&#39;, &#39;3&#39;, &#39;3&#39;]
m &#61; p.finditer("sahd3sak32xsfi8dcsk3223sa1")
#返回一个顺序访问每一个匹配结果&#xff08;match对象&#xff09;的迭代器
for i in m:print(i.group())
#-----output------
#
3 32 8 3223 1
#
sub(repl, string[, count]) | re.sub(pattern, repl, string[, count]):
#
使用repl替换string中每一个匹配的子串后返回替换后的字符串。
#
当repl是一个字符串时&#xff0c;可以使用\id或\g、\g引用分组&#xff0c;但不能使用编号0。
#
当repl是一个方法时&#xff0c;这个方法应当只接受一个参数&#xff08;Match对象&#xff09;&#xff0c;并返回一个字符串用于替换
#
&#xff08;返回的字符串中不能再引用分组)count用于指定最多替换次数&#xff0c;不指定时全部替换
p &#61; re.compile(r&#39;(\w&#43;) (\w&#43;)&#39;)
s
&#61; "i say, hello world!"
print(p.sub(r"\2 \1",s))
#-----output------
#
say i, world hello!
def func(m):return m.group(1).title() &#43; &#39; &#39; &#43; m.group(2).title()
print(p.sub(func,s))
#-----output-----
#
I Say, Hello World!

 

转:https://www.cnblogs.com/BUPT-MrWu/p/9735945.html



推荐阅读
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • Python语法上的区别及注意事项
    本文介绍了Python2x和Python3x在语法上的区别,包括print语句的变化、除法运算结果的不同、raw_input函数的替代、class写法的变化等。同时还介绍了Python脚本的解释程序的指定方法,以及在不同版本的Python中如何执行脚本。对于想要学习Python的人来说,本文提供了一些注意事项和技巧。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • Linux磁盘的分区、格式化的观察和操作步骤
    本文介绍了如何观察Linux磁盘的分区状态,使用lsblk命令列出系统上的所有磁盘列表,并解释了列表中各个字段的含义。同时,还介绍了使用parted命令列出磁盘的分区表类型和分区信息的方法。在进行磁盘分区操作时,根据分区表类型选择使用fdisk或gdisk命令,并提供了具体的分区步骤。通过本文,读者可以了解到Linux磁盘分区和格式化的基本知识和操作步骤。 ... [详细]
  • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
  • 成功安装Sabayon Linux在thinkpad X60上的经验分享
    本文分享了作者在国庆期间在thinkpad X60上成功安装Sabayon Linux的经验。通过修改CHOST和执行emerge命令,作者顺利完成了安装过程。Sabayon Linux是一个基于Gentoo Linux的发行版,可以将电脑快速转变为一个功能强大的系统。除了作为一个live DVD使用外,Sabayon Linux还可以被安装在硬盘上,方便用户使用。 ... [详细]
  • 本文介绍了Linux Shell中括号和整数扩展的使用方法,包括命令组、命令替换、初始化数组以及算术表达式和逻辑判断的相关内容。括号中的命令将会在新开的子shell中顺序执行,括号中的变量不能被脚本余下的部分使用。命令替换可以用于将命令的标准输出作为另一个命令的输入。括号中的运算符和表达式符合C语言运算规则,可以用在整数扩展中进行算术计算和逻辑判断。 ... [详细]
  • 本文讨论了如何使用IF函数从基于有限输入列表的有限输出列表中获取输出,并提出了是否有更快/更有效的执行代码的方法。作者希望了解是否有办法缩短代码,并从自我开发的角度来看是否有更好的方法。提供的代码可以按原样工作,但作者想知道是否有更好的方法来执行这样的任务。 ... [详细]
author-avatar
叮叮当叮叮当叮叮当_212
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有