目录
一、什么叫模块?
二、常用的内置模块
2.1.数学计算模块-math
2.2.日期时间模块-datetime
1)datetime类
2)date类
3)time类
4)计算时间跨度-timedelta
5)字符串时间转换-strftime、strptime
2.3.正则表达式模块-re
1)字符串匹配(match(p,text))
2)字符串查找(search(p,text))
3)字符串替换(replace(p,text))
4)字符串分割
一、什么叫模块?
在python中一个模块就是一个脚本文件(.py),模块是保存代码的最小单位,在模块中可以声明变量、函数、属性和类等python代码元素。
一个模块可以访问另一个模块,这很大一程度了python语言流行的很大因素就是强大的第三方功能模块。那模块间是怎么互相访问的呢?需要进行导入访问。访问方式有三种:
1)import <模块名>:通过这种方式会导入m2模块的所有代码元素,在访问时需要加前缀“m2.”
2)from <模块名> import <代码元素>:通过这种方式会导入m2中的x变量,在访问时不需要加前缀“m2.”
3)from <模块名> import <代码元素> as “代码元素别名”:与2)类似,如果说第二种方式中导入的代码元素和当前的代码中的元素出现冲突,就可以通过另起别名的方式来进行冲突解决。
二、常用的内置模块
在真正做项目时,我们会经常使用别人已经开发好的模块,这样就不用从零开始开发项目了,还可以加快开发速度。这些模块可能是python官方提供的,也可能是第三方开发的。其中,python官方提供的模块,就称之为“内置模块”。
2.1.数学计算模块-math
在math模块中包含数学运算相关的函数等。例如常见的指数函数、对数函数、平方根和三角函数等。
| 函数 | 说明 |
| ceil(x) | 返回大于或等于x最小整数 |
| floor(x) | 返回小于或等于x最大整数 |
| sqrt(x) | 返回x的平方值 |
| pow(x,y) | 返回x的y次幂的值 |
| math.log(x[,base]) | 返回以base为底的对数,若省略底数base,则计算x自然对数 |
| sin(x) | 返回弧度x的三角正弦 |
| degrees(x) | 将弧度x转化为角度 |
| radians(x) | 将角度x转化为弧度 |
例如:
import math x = 30.2442 # 1. 向上取整(ceil) print(f"大于或等于 x 的最小整数是:{math.ceil(x)}") # 输出 31 # 2. 向下取整(floor) print(f"小于或等于 x 的最大整数是:{math.floor(x)}") # 输出 30 (修正描述) # 3. 平方 print(f"x 的平方值是:{x ** 2}") # 或 math.pow(x, 2) # 4. 幂运算(4次方) print(f"x 的 4 次幂的值是:{math.pow(x, 4)}") # 或 x ** 4 # 5. 以10为底的对数 print(f"以10为底 x 的对数值是:{math.log10(x)}") # 更简洁,比 math.log(x,10) 快 # 6. 正弦(假设 x 是弧度) print(f"弧度 x 的三角正弦值是:{math.sin(x)}") # 7. 弧度转角度 print(f"将弧度 x 转化为角度,值为:{math.degrees(x)}") # 8. 角度转弧度(注意 x 此时被当作角度) print(f"将角度 x 转化为弧度,值为:{math.radians(x)}")2.2.日期时间模块-datetime
Python官方提供的日期和时间模块主要是datetime模块。在datetime模块中提供了右侧几个类。
datetime:包含时间和日期。
date:只包含日期。
time:只包含时间。
timedelta:计算时间跨度。
tzinfo:时区信息。
1)datetime类
datetime类表示日期和时间等信息,我们可以使用如下构造方法创建datetime对象:
这个值超过范围,就会导致发生错误,例如:ValueError: day is out of range for month
datetime.datetime(year,month,day,hour=0,minute=0,second=0,microsecond=0,tzinfo=None)
参数说明如下:
| 参数 | 说明 | 取值范围 |
| year | 年,不可以省略 | datetime.MINYEAR ≤ year ≤ datetime.MAXYEAR |
| month | 月,不可以省略 | 1 ≤ month ≤ 12 |
| day | 日,不可以省略 | 1 ≤ day ≤ 给定年份和月份,这时该月的最大天数 |
| hour | 小时,可以省略 | 0 ≤ month < 24 |
| minute | 分钟,可以省略 | 0 ≤ minute < 60 |
| second | 秒,可以省略 | 0 ≤ second < 60 |
| microsecond | 微秒,可以省略 | 0 ≤ microsecond < 1000000 |
| tzinfo | 时区 | 无 |
datetime类的常用方法如下:
datetime.today():返回当前的本地日期和时间。
datetime.now(tz=None):返回指定时区的当前日期和时间,参数tz用于设置时区,如果参数tz为None或省略,则等同于today();
datetime.fromtimestamp (timestamp, tz=None):返回与UNIX时间戳对应的本地日期和时间。UNIX时间戳是从1970年1月1日00:00:00开始到现在为止的总秒数。
例如:
import datetime d = datetime.datetime(2026,8, 30) print(d) d_detail = datetime.datetime(2026,8,30,5,23, 34) print(d_detail) print(f"现在的时间是:{datetime.datetime.today()}") print(f"返回指定时区的时间:{datetime.datetime.now()}")结果:
2)date类
date类表示日期信息,我们可以使用如下构造方法创建date对象:datetime.date(year,month,day)
这些参数的含义和取值范围与datetime类一样。
date类的常用方法如下:
date.today():返回当地的本地日期。
date.fromtimestamp(timestamp):返回与UNIX时间戳对应的本地日期。
例如:
import datetime date1 = datetime.date.today() print(f"当前的时间是:{date1}")结果:
3)time类
time类表示一天中的时间信息,我们可以使用如下构造方法创建time对象:
datetime.time(hour=0,minut=0,second=0,microsecond=0,tzinfo=None),这里的参数的含义和取值范围与datetime类一样。
例如:
import datetime date1 = datetime.time(5,25,2) print(f"当前的时间是:{date1}")4)计算时间跨度-timedelta
试想一下我们,我想知道20天之后是哪一天,或则说我们当前想知道2027年1月1日是哪一天,应该如何计算?
时间的相加减不是简单的加减法,不能简单的讲当前的时间 +/- 来进行计算。因为他俩就不是同一个类型的数据。直接相加减会报错:TypeError: unsupported operand type(s) for +: 'datetime.date' and 'int'
python内置的时间处理模块里边有一个timedelta类。timedelta类专门用于计算datetime、date和time对象的时间间隔。
timedelta类的构造方法如下:
datetime.timedelta(days=0,seconds=0,microseconds=0,miliseconds=0,minutes=0,hours=0,weeks=0)
其中的所有参数都可以为整数或浮点数,也可以为正数或负数,如下表所示:
| 参数 | 说明 |
| day | 天 |
| second | 秒 |
| microsecond | 微秒 |
| miliseconds | 毫秒 |
| minute | 分钟 |
| hour | 小时 |
| weeks | 周 |
import datetime date_now = datetime.date.today() print(f"当前的时间是:{date_now}") # 构建10天这个timedelta对象 d = datetime.timedelta(10) print(f"d的数据类型是:{type(d)},10天后的时间是:{date_now + d}") # 构建2周前的timedelta对象 d2 = datetime.timedelta(weeks=-2) print(f"两周前的时间是:{date_now + d2}")5)字符串时间转换-strftime、strptime
我们经常会遇到将日期时间与字符串相互转换的情况。
1、将日期时间对象转换为字符串时,称之为日期时间格式化。在Python中使用strftime()方法进行日期时间的格式化,在datetime、date和time三个类中都有一个实例方法strftime(format)。
2、将字符串转换为日期时间对象的过程,叫作日期时间解析。在Python中使用datetime.strptime (date_string,format)类方法进行日期时间解析。
3、在strftime()和strptime()方法中都有一个格式化参数format,用来控制日期时间的格式,常用的日期和时间格式控制符如下表所示:
| 指令 | 含义 | 示例 |
| %m | 两位月份表示 | 01、02、03 |
| %y | 两位年份表示 | 08、18 |
| %Y | 四位年份表示 | 2008、2018 |
| %d | 两位表示月中的一天 | 01、02、03 |
| %H | 两位小时表示(24小时制) | 00、01、23 |
| %I | 两位小时表示(12小时制) | 01、02、12 |
| %p | AM或PM区域性设置 | AM或PM |
| %M | 两位分钟表示 | 00、01、59 |
| %S | 两位秒表示 | 00、01、59 |
| %f | 以6位数表示微秒 | 000000、000001、.....、999999 |
| %z | +HHMM或-HHMM形式的UTC漂移 | +0000、-0400、+1030,如果没有设置时区,则为空 |
| %Z | 时区名称 | UTC、EST、CST,如果没有设置时区,则为空。 |
例如:
import datetime # 将时间按照格式化进行输出 d = datetime.datetime.today() print(f"将当前获取到的时间进行格式化:{d.strftime('%Y-%m-%d %H:%M:%S')}") print(f"将当前获取到的时间格式化为:%Y-%m-%d,值为:{d.strftime('%Y-%m-%d')}") # 将字符串转换为时间 str_date = '2026-08-25 10:40:25' print(f"str_date的数据类型是:{type(str_date)}") str_to_date = datetime.datetime.strptime(str_date, '%Y-%m-%d %H:%M:%S') print(f"转化为后的str_to_date数据类型是:{type(str_to_date)},值为:{str_to_date}")结果:
2.3.正则表达式模块-re
正则表达式指预先定义好一个“字符串模板”,通过这个“字符串模板可以匹配、查找和替换那些匹配“”字符串模板的字符串。他对字符串的操作效率更高、更能更强大。
1)字符串匹配(match(p,text))
字符串匹配指验证一个字符串是否符合指定的“字符串模板”,常用于用户输入验证。例如,用户在注册时要输入邮箱,所以需要验证邮箱是否有效,这就要用到字符串匹配验证。
语法格式:match(p,text)
match(p,text)函数进行字符串匹配,其中的参数p是正则表达式,即字符串模板,text是要验证的字符串。如果匹配成功,则返回一个Match对象(匹配对象),否则返回None。
正则表达式:一套用于描述文本规则的“公式”或“筛选条件”。
正则表达式中常用的模式匹配:
| 模式 | 含义 | 示例 |
|---|---|---|
. | 任意字符(除换行符) | a.c匹配abc,a#c,即表示两中间的.即可表示任意字符。 |
* | 0次或多次重复前一字符 | ab*匹配a,ab,abb |
+ | 1次或多次重复 | ab+匹配ab,abb |
? | 0次或1次重复(非贪婪) | ab?匹配a或ab |
{n} | 恰好 n 次重复 | \d{3}匹配三位数字 |
{n,m} | n 到 m 次重复 | \d{2,4}匹配2~4位数字 |
[abc] | 字符集,匹配 a/b/c 之一 | [aeiou]匹配元音字母 |
[^abc] | 否定字符集,不匹配 a/b/c | [^0-9]匹配非数字 |
\d | 数字,等价于[0-9] | |
\w | 单词字符(字母、数字、下划线) | |
\s | 空白字符(空格、制表符、换行等) | |
^ | 字符串开头(或行开头,在 MULTILINE 模式) | ^Hello匹配以 Hello 开头 |
$ | 字符串结尾 | world$匹配以 world 结尾 |
| | 或逻辑 | cat|dog匹配 cat 或 dog |
\b | 单词边界 | \bthe\b匹配独立的单词 the |
例如:
p = r"\d{3}-\d{4}-\d{4}":即表示匹配3位-4位-4位所匹配的上的字符串
p = r'\w+@guizhou\.com':即表示匹配的字符串,首字符的是单词字符(字母、数字、下划线)可出现一次或多次,后接@guizhou字符串后跟“\.”,不是把“.”作为普通字符对待,最后再拼接com
示例1:
import re text = "我的电话号码是 138-1234-5678,备用号是 010-8888-9999。" # re.search() —— 查找第一个匹配位置 phone_pattern = r"\d{3}-\d{4}-\d{4}" # 匹配 3位-4位-4位 数字 match = re.search(phone_pattern, text) if match: print("找到第一个号码:", match.group()) # 输出: 138-1234-5678 print("起始索引:", match.start()) # 输出: 8 print("结束索引:", match.end()) # 输出: 21 # re.findall() —— 返回所有匹配的字符串列表 all_phones = re.findall(phone_pattern, text) print("所有号码:", all_phones) # 输出: ['138-1234-5678', '010-8888-9999'] # re.match() —— 从字符串开头匹配 result = re.match(r"我的", text) # 匹配开头 print(bool(result)) # True result = re.match(r"电话", text) # 开头不是"电话" print(bool(result)) # False结果:
示例2:
import re # 小写 \w 匹配字母、数字、下划线 p = r"\w+@guizhou\.com" # 创建测试用例 email1 = "ZhangSan@guizhou.com" email2 = "@@$!$_12@guizhou.com" email3 = "123@guizhou.com" # 返回匹配结果,并将匹配结果返回给变量m1,m2,m3 m1 = re.match(p, email1) m2 = re.match(p, email2) m3 = re.match(p, email3) print(m1,m2,m3) # 输出匹配对象,非 None print(type(m1)) # <class 're.Match'> print(m1.group()) print(type(m2)) # print(m2.group()) print(type(m3)) print(m3.group())2)字符串查找(search(p,text))
字符串查找指从一个字符串中查找匹配正则表达式的子字符串,常用于数据分析、网络爬虫等数据处理中。
查用的字符串查找函数如下:
search(p,text):在text字符串中查找匹配的内容,如果找到,则返回第一个匹配的Match对象,否则返回None。p是正则表达式。
findall(p,text):在text字符串中查找所有匹配的内容,如果找到,则返回所有匹配的字符串列表;如果一个都没有匹配,则返回None,p是正则表达式。
例如:
import re # 小写 \w 匹配字母、数字、下划线 p = r"\w+@guizhou\.com" # 创建测试用例 email1 = "ZhangSan@guizhou.com" email2 = "@@$!$_12@guizhou.com_13@guizhou.com" email3 = "123@guizhou.com" # 返回匹配结果,并将匹配结果返回给变量m1,m2,m3 m1 = re.match(p, email1) m2 = re.search(p, email2) m3 = re.findall(p, email2) print(m1,m2,m3) # 输出匹配对象,非 None print(type(m1)) # <class 're.Match'> print(m1.group()) print(type(m2)) print(m2.group()) print(type(m3)) for x in m3: print(x)3)字符串替换(replace(p,text))
正则表达式的字符串替换函数是sub(),该函数替换匹配的字符串,返回值是替换之后的字符串,其语法格式如下:
re.sub(pattern,repl,string,count=0)
其中,参数pattern是正则表达式;参数repl是用于替换的新字符串;参数string是积极那个被替换的旧字符串;参数count是要替换的最大数量,默认值为零,表示不限制替换数量。
import re # 小写 \w 匹配字母、数字、下划线 p = r"\w+@guizhou\.com" # 创建测试用例 email1 = "ZhangSan@guizhou.com" email2 = "123@guizhou.com" email3 = "@@$!$_12@guizhou.com_13@guizhou.com" # 返回匹配结果,并将匹配结果返回给变量m1,m2,m3 m1 = re.match(p, email1) m2 = re.search(p, email2) m3 = re.sub(p, "hello world!",email3) print(m1,m2) # 输出匹配对象,非 None print(type(m1)) # <class 're.Match'> print(m1.group()) print(type(m2)) print(m2.group()) print(f"最后email3邮箱的地址是:{m3}")4)字符串分割
在python中使用re模块中的split()函数进行字符串分割,该函数按照匹配的子字符串进行字符串分割,返回字符串列表对象,其语法格式如下:
re.split(pattern,string,maxsplit=0)
其中,参数pattern是正则表达式;参数string是要分割的字符串;参数maxsplit是最大分割次数;maxsplit的默认值为零,表示分割次数没有限制。
import re p = r"\d+" text = "AB12CD34EF" clist = re.split(p,text) print(clist) clist2 = re.split(p,text,maxsplit=1) print(clist2) clist3 = re.split(p,text,maxsplit=2) print(clist3)