模块 正则表达式
1.自定义模块
1.1模块和包
由于所有函数都定义在一个文件中会大大降低这段代码的可读性,所以可以将函数定义在其他的文件中,再使用from import 关键字来调用。其中相关的功能。
包,一般指存放模块的文件夹。
模块,一般指存放功能函数的py文件。
1.2导入(路径相关)
当定义好一个模块和包之后,用from 文件路径 import 函数 来导入文件。
python在找模块时,只会去几个指定的路径寻找。
也可以自动手动在sys.path中添加指定路径,然后再导入就可以,例如
import sys
sys.path.append("路径a")
improt xxx
2.第三方模块
1.pip(最常用)
这是python中最最最常用的安装第三方模块的方式,pip其实是一个第三方模块包管理工具,默认安装python解释器是自动会安装。
使用pip全装第三方模块也非常简单,只需要在自己终端执行:
pip install 模块名称
即可。
3.内置模块
python内置的模块有很多,我们也接触了不少相关的模块,接下来我们就来做一些汇总和介绍。
(29条消息) python 常用的内置模块_一起学习-CSDN博客_python内置模块
常见的就自己查文章拉啦,这里讲一些其他的。
3.1json
json模块,可以将python的数据格式转化为json格式的数据,也可以将json格式的数据也可以转换成python格式的数据。
json格式,是一个数据格式(本质上就是个字符串,常用于网络数据传输。)
3.1.1核心功能
跨语言数据的传输,例如
A系统用python开发
B用java开发
语言不通基础数据类型格式都不同,
为了方便数据传输,大家约定一个格式,json格式,每种语言都是将自己的数据类型转换为json格式然后再转换为其他的语言的数据类型。
Python与json格式的相互转换:
数据类型->json,一般称为:序列化
import json
data = [
{"id":1,"name":"dhk","age":123},
{"id":2,"name":"动肝","age":312}
]
res = json.dumps(data)
print(res)#[{"id": 1, "name": "dhk", "age": 123}, {"id": 2, "name": "\u52a8\u809d", "age": 312}]
res = json.dumps(data,ensure_ascii=False)
print(res)
#[{"id": 1, "name": "dhk", "age": 123}, {"id": 2, "name": "动肝", "age": 312}]
json->python数据类型,一般称为:发序列化
import json
data_string = '[{"id": 1, "name": "dhk", "age": 123}, {"id": 2, "name": "动肝", "age": 312}]'
data_list = json.loads(data_string)
print(data_list)#[{'id': 1, 'name': 'dhk', 'age': 123}, {'id': 2, 'name': '动肝', 'age': 312}]
小例子:
写一个网站,给用户返回json数据格式
使用flask写个网站
import json
from flask import Flask
app = Flask(__name__)
def index():
return "首页"
def user():
data = [
{"id": 1, "name": "dhk", "age": 123},
{"id": 2, "name": "动肝", "age": 312}
]
return json.dumps(data)
app.add_url_rule('/index/',view_func=index,endpoint='index')
app.add_url_rule('/user/',view_func=user,endpoint='user')#用户在地址栏输入user执行user函数。
if __name__ == '__main__':
app.run()
2.写个爬虫把这个数据给爬到
import requests
import json
url = "http://127.0.0.1:5000/user/"
res = requests.get(url)
reslut = json.dumps(res.text)#反序列化
print(reslut)
3.1.2类型要求
python的数据类型转换为json格式,对数据类型是有要求的:
3.2时间处理
UTC/GMT:世界时间
本地时间:本地时区的时间
python中关于时间处理的模块有两个,分别是time和datetime
3.2.1time
import time
v1 = time.time()#本时区的时间戳
print(v1)
v2 = time.timezone
print(v2)
print("start")
time.sleep(3)#延时三秒钟再执行
print("end")
3.2.2datetime
平时开发过程的时间一般以如下三种格式存在:
datetime
from datetime import datetime,timezone,timedelta
v1 = datetime.now()#当前本地时间
print(v1)#2022-01-04 15:51:24.055927
v2 = datetime.utcnow()#utc当前时间
print(v2)
tz = time(timedelte(hours=7))#当前东七区
v2 = datetime.now(tz)
print(v2)
字符串
#字符串格式的时间 转换为datetime格式时间
text = "2021-11-11"
v1 = datetime.strptime(text,"%Y-%m-%d")
print(v1)#2021-11-11 00:00:00
#datetime格式 转换为字符串
v1 = datetime.now
val = v1.strftime("%Y-%m-%d %H:%M:%S")
print(val)
4.正则表达式相关
当给你一大堆文本信息,让你提取其中的指定数据时,可以使用正则来实现。例如:提取文本中的邮箱和手机号
import re
text = "太厉害了,给我一份资源吧!我的邮箱号是123456789@qq.com和dhk@live.com,这是我的手机号12312312315!"
phone_list = re.findall("1[2|3|5]\d{9}",text)
print(phone_list)#['12312312315']
正则表达式并不是只属于python,在其他语言中同样存在。
4.1正则表达式
4.1.1字符相关
1.dhk 匹配文本中的dhk
import re
text = "你好啊dhk,我知道其实你dhk是一个joker,但是身为joker的dhk是不能暴露身份的,"
data_list = re.findall("dhk",text)
print(data_list)#['dhk', 'dhk', 'dhk']
2.[dhk]匹配d或h或k
import re
text = "你好啊dhk,我知道其实你dhk是一个joker,但是身为joker的dhk是不能暴露身份的,"
data_list = re.findall("[dhk]",text)
print(data_list)
'''
['d', 'h', 'k', 'd', 'h', 'k', 'k', 'k', 'd', 'h', 'k']
'''
import re
text = "你好啊dhk,我知道其实你dhk是一个joker,但是身为joker的dhk是不能暴露身份的,"
data_list = re.findall("d[hk]",text)#q开头的字符串,后面的内容只能是h或者是k
print(data_list)#['dh', 'dh', 'dh']
3.匹配除了abc以外的字符串
import re
text = "你好啊dhk,我知道其实你dhk是一个joker,但是身为joker的dhk是不能暴露身份的,"
data_list = re.findall("[^dhkj]",text)
print(data_list)
4.[a-z]匹配a~z的任意字符,([0-9]也可以)
import re
text = "你好啊dhk,我知道其实你dhk是一个joker,但是身为joker的dhk是不能暴露身份的,"
data_list = re.findall("[d-e]",text)
print(data_list)#['d', 'd', 'e', 'e', 'd']
5.”.”代指出换行符以外的任意字符
import re
text = "你好啊dhk,我知道其实你dhk是一个joker,但是身为joker的dhk是不能暴露身份的,"
data_list = re.findall("d.k",text)
print(data_list)#['dhk', 'dhk', 'dhk']
import re
text = "你好啊dhkk,我知道其实你dhkk是一个joker,但是身为joker的dhk是不能暴露身份的,"
data_list = re.findall("d.+k",text)#贪婪匹配是能匹配长的就匹配长的,可以是任意字符,任意数量。
print(data_list)#['dhkk,我知道其实你dhkk是一个joker,但是身为joker的dhk']
import re
text = "你好啊dhk,我知道其实你dhk是一个joker,但是身为joker的dhk是不能暴露身份的,"
data_list = re.findall("d.+?k",text)#非贪婪匹配,能匹配短的就匹配短的。
print(data_list)#['dhk', 'dhk', 'dhk']
6.\w指代字母或数字或下划线(汉字)。
import re
text = "你好啊dhk,我知道其实你dhk是一个joker,但是身为 joker的dhk是不能暴露身份的,"
data_list = re.findall("jo\w+k",text)#不加问号就是贪婪匹配
print(data_list)
7.\d代指所有的数字
import re
text = "123asd123sad2_123minadasd"
data_list = re.findall("d\d",text)
print(data_list)#['d1', 'd2']
8.\s代指一的空白符,包括空格,制表符等。
import re
text = "root admin add admin"
data_list = re.findall("a\w+\s\w+",text)
print(data_list)#['admin add']
4.1.2数量相关
1.*重复0次或更多次
import re
text = "dhk is a joke,definitely a joker"
data_list = re.findall("ker*",text)
print(data_list)#['ke', 'ker']
2.+重复1次或更多次
import re
text = "dhk is a joke,definitely a joker"
data_list = re.findall("j\w+k",text)
print(data_list)#['jok', 'jok']
3.?重复0次或1次
import re
text = "dhk is a joke,definitely a joasdasdasdker"
data_list = re.findall("j\w?k",text)
print(data_list)#['jok']
4.{n}重复n次
5.{n,}重复n次或多次
6.{n,m}重复n次到m次
4.1.3括号(分组)
1.提取数据区域
import re
text = "楼主你这资源好啊,我有个朋友想要。1231231231"
data_list = re.findall("1231(2\d{5})",text)#意味着匹配还是按照没有括号的时候匹配,但是返回的值是括号里面的。
print(data_list)#['231231']
import re
text = "楼主你这资源好啊,我有个朋友想要。1231231231"
data_list = re.findall("(1231(2\d{5}))",text)#由于这里有两层括号,所以会先返回小括号的内容,然后返回大括号的内容。
print(data_list)#[('1231231231', '231231')]
2.获取指定区域+或条件
import re
text = "哇你这dhk真1231admin23123的是一个小丑啊!天ro123123123ot哪!joker,来点资源123123clown123"
data_list = re.findall("1231(\d{4}|\w{5}\d+)3",text)#这里面的管道符|就是或条件
print(data_list)#['admin2312', '2312']
4.1.4 ^起始$结束
4.1.5特殊字符
由于正则表达式中各种特殊符号都有特殊的含义,所以如果想要在正则中匹配这种指定的字符,需要转移
import re
text = "dhk is a{9}clown!"
data = re.findall("a\{9\}clown!",text)
print(data)#['a{9}clown!']
要使用\进行转义
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。后续可能会有评论区,不过也可以在github联系我。