八、学习py:模块

模块 正则表达式

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格式,对数据类型是有要求的:

image-20220104153252331

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.image-20220104175556760匹配除了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联系我。