第4章 Python标准库
[TOC]
1. 文字处理的 re
A.re相关方法(正则表达式对象Pattern相关方法)
- 字符串前面加 r 表示去掉 \ (反斜杆)的转义机制
- 字符串前面加 u 表示以Unicode 格式 进行编码
- 字符串前面加 b 表示后面的字符串是bytes类型
- comiple(),传入参数表示要匹配的字符串
- match(),如果字符串开始位置能够找到这个正则样式的任意个匹配,就返回一个相应的匹配对象。
- group(),取出匹配后的分组,分组可以通过小括号实现,传入参数int,表示第几组,如果不传参,表示取出所有的部分
- groups(),取出所有的组合
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17import re
p = re.compile(r'(\d+)-(\d+)-(\d+)')
print(p.match('2018-05-10'))
print(p.match('20180510'))
print(p.match('2018-05-10').group())
print(p.match('2018-05-10').group(1))
print(p.match('2018-05-10').groups())
"""
输出结果
<_sre.SRE_Match object; span=(0, 10), match='2018-05-10'>
None
2018-05-10
2018
('2018', '05', '10')
""" - search()扫描整个字符串寻找第一个匹配的位置,如果有匹配返回一个相应的匹配对象。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17import re
p = re.compile(r'(\d+)-(\d+)-(\d+)')
print(p.match('aa2018-05-10bb'))
print(p.match('2018-05-10bb'))
print(re.match(r'(\d+)-(\d+)-(\d+)', '2018-05-10bb'))
print(p.search('aa2018-05-10bb'))
print(re.search(r'(\d+)-(\d+)-(\d+)', 'aa2018-05-10bb'))
"""
输出结果
None
<_sre.SRE_Match object; span=(0, 10), match='2018-05-10'>
<_sre.SRE_Match object; span=(0, 10), match='2018-05-10'>
<_sre.SRE_Match object; span=(2, 12), match='2018-05-10'>
<_sre.SRE_Match object; span=(2, 12), match='2018-05-10'>
""" - sub()将字符串中符合正则表达式的全部替换
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16from re import sub
phone = '123-456-789 # 这是电话号码'
p2 = sub(r'#.*$', '', phone)
print(p2)
p3 = sub(r'\D', '', phone)
print(p3)
p4 = sub(r'\d', '', phone)
print(p4)
"""
输出结果
123-456-789
123456789
-- # 这是电话号码
""" - findall() 对字符串返回一个不重复的符合正则的匹配列表,字符串从左到右进行扫描,匹配按找到的顺序返回
1
2
3
4
5
6
7
8
9
10import re
p = re.compile(r'(\d+)-(\d+)-(\d+)')
print(re.findall(r'(\d+)-(\d+)-(\d+)', 'a2018-05-10b2018-05-10c2018-05-10d'))
print(p.findall('a2018-05-10b2018-05-10c2018-05-10d'))
"""
输出结果
[('2018', '05', '10'), ('2018', '05', '10'), ('2018', '05', '10')]
[('2018', '05', '10'), ('2018', '05', '10'), ('2018', '05', '10')]
"""
B.常用元字符
- ‘.’在默认模式,匹配除了换行的任意字符。如果指定了标签DOTALL ,它将匹配包括换行符的任意字符
- ‘^’匹配字符串的开头,并且在MULTILINE 模式也匹配换行后的首个符号
- ‘$’匹配字符串尾或者换行符的前一个字符,在MULTILINE 模式匹配换行符的前一个字符
- ‘*’对它前面的正则式匹配0到任意次重复,尽量多的匹配字符串
- ‘+’对它前面的正则式匹配 1 到任意次重复
- ‘?’对它前面的正则式匹配 0 到 1 次重复。
在修饰符之后添加?将使样式以非贪婪方式或者最小方式进行匹配;尽量少的字符将会被匹配 - ‘{m}’对其之前的正则式指定匹配 m 个重复;少于 m 的话就会导致匹配失败
- ‘{m,n}’对正则式进行 m 到 n 次匹配,在 m 和 n 之间取尽量多
- ‘[]’用于表示一个字符集合。在一个集合中:
- 字符可以单独列出,比如 [amk] 匹配 ‘a’,’m’,或者 ‘k’
- 可以表示字符范围,通过用 ‘-‘ 将两个字符连起来。比如 [a-z] 将匹配任何小写 ASCII 字 符,[0-5][0-9] 将匹配从 00 到 59 的两位数字,[0-9A-Fa-f] 将匹配任何十六进制数位。 如果 - 进行了转义(比如 [a-z])或者它的位置在首位或者末尾(如 [-a] 或 [a-]),它就 只表示普通字符 ‘-‘
- 特殊字符在集合中,失去它的特殊含义。比如 [(+)] 只会匹配这几个文法字符 ‘(‘, ‘+’, ‘‘, or ‘)’
- 字符类如 \w 或者 \S (如下定义) 在集合内可以接受,它们可以匹配的字符由ASCII 或 者LOCALE 模式决定
- 不在集合范围内的字符可以通过 取反来进行匹配。如果集合首字符是 ‘^’ ,所有 不在集合 内的字符将会被匹配,比如 [^5] 将匹配所有字符,除了 ‘5’,[^^] 将匹配所有字符,除了 ‘^’. ^ 如果不在集合首位,就没有特殊含义
- 在集合内要匹配一个字符 ‘]’,有两种方法,要么就在它之前加上反斜杠,要么就把它放到 集合首位。比如,[()[]{}] 和 [{}] 都可以匹配括号
- ‘|’A|B,A 和 B 可以是任意正则表达式,创建一个正则表达式,匹配 A 或者 B. 任意个正则表达式可以用 ‘|’ 连接
- ‘\d’匹配数字,等同于[0-9]
- ‘\D’匹配非数字
- ‘\s’匹配一个字符串,只包括a-z
- ‘()’表匹配括号内的任意正则表达式,并标识出组合的开始和结尾
2. 日期类型的time、datetime
A.time一般用于日期和时间的查看
epoch是时间开始的点,并且取决于平台,一般是1970年1月1日00:00:00
UTC 是协调世界时(以前称为格林威治标准时间,或 GMT)
DST 是夏令时,在一年中的一部分时间(通常)调整时区一小时
time()返回浮点数从epoch到当前时间的秒
gmtime()从epoch到当前的时间转换为UTC的struct_time
localtime()从epoch到当前的时间转换为UTC的struct_time
time.struct_time返回的时间值序列的类型为gmtime()、localtime()和strptime()。它是一个带有named tuple 接口的对象:可以通过索引和属性名访问值。存在以下值:
索引 属性 值 0 tm_year (例如,1993) 1 tm_mon range [1, 12] 2 tm_mday range [1, 31] 3 tm_hour range [0, 23] 4 tm_min (range [0, 59] 5 tm_sec range [0, 61] 6 tm_wday range [0, 6] ,周一为 0 7 tm_yday range [1, 366] 8 tm_isdst 0, 1 或 -1 N/A tm_zone 时区名称的缩写 N/A tm_gmtoff 以秒为单位的 UTC 以东偏离 strftime(format[, t ])转换一个元组或struct_time表示的由gmtime()或localtime()返回的时间到由format参数指定的字符串。如果未提供t,则使用由localtime()返回的当前时间。format必须是一个字符串。如果t中的任何字段超出允许范围,则引发ValueError。
指令 意义 %Y 十进制数表示的带世纪的年份。 %y 十进制数 [00,99] 表示的没有世纪的年份。 %m 十进制数 [01,12] 表示的月。 %d 十进制数 [01,31] 表示的月中日。 %H 十进制数 [00,23] 表示的小时(24 小时制)。 %M 十进制数 [00,59] 表示的分钟。 %S 十进制数 [00,61] 表示的秒。 %w 十进制数 [0(星期日),6] 表示的周中日。 %c 本地化的适当日期和时间表示。 %W 十进制数 [00,53] 表示的一年中的周数(星期一作为一周的第一天)作为。在第一个星期一之前的新年中的所有日子被认为是在第 0 周。 %% 字符%
1 | import time |
B.datetime一般用于日期和时间的修改
- datetime.date 年月日
- datetime.time 时分秒微秒
- datetime.datetime 年月日 时分秒微秒
- datetime.timedelta(days=0,seconds=0,microseconds=0,milliseconds=0,minutes=0,hours=0,weeks=0)
1
2
3
4
5
6
7
8
9
10
11
12
13
14import datetime
print(datetime.datetime.now())
new_time = datetime.timedelta(minutes=10)
print(datetime.datetime.now() + new_time)
one_day = datetime.datetime(2016, 4, 26)
new_date = datetime.timedelta(days=-2)
print(one_day + new_date)
"""
输出结果
2019-12-24 22:12:45.037225
2019-12-24 22:22:45.037280
2016-04-24 00:00:00
"""
3. 数字和数学类型的math、random
A.math数学相关的库
用于机器学习以及深度学习当中,比如计算正弦值等
B.random生成伪随机数
- random.random()返回 [0.0, 1.0) 范围内的下一个随机浮点数
- random.randint(a, b)返回随机整数N满足a <= N <= b。相当于randrange(a, b+1)。
- random.choice(seq)从非空序列 seq 返回一个随机元素。如果 seq 为空,则引发IndexError。
1
2
3
4
5
6
7
8
9
10
11import random
print(random.random())
print(random.randint(1, 5))
print(random.choice(['aa', 'bb', 'cc']))
"""
输出结果
0.05640301910553813
2
bb
"""
4. 文件和目录访问的pathlib、os.path
A.Linux和MacOS下常用的文件操作命令
- ls 查看文件夹里面内容
- ls -l 显示文件夹里面内容包括详情,第一个字符是-表示是文件,第一个字符是d表示是文件夹
- pwd 显示当前文件夹的绝对路径
- cd+文件夹绝对路径 进入对应的文件夹
- cd+相对路径 进入当前路径对应的目录文件夹中
- cd .. 返回上级目录
- mkdir+绝对路径(相对路径) 新建对应的文件夹,如果中间目录不存在可以通过mkdir -p 绝对路径(相对路径)创建
- rmdir+路径 删除文件夹,如果文件下还有文件需要使用rm -rf 路径删除
- cp 路径A 路径B :把路径A拷贝到路径B中
- mv 文件名 新文件名:给文件重新命名
- mv 文件名 目录名:将文件移动到目标目录
- mv 目录名 目录名:目标目录已存在,将源目录移动到目标目录;目标目录不存在则改名
B.os.path库
- os.path.abspath() 传入路径,会返回文件对应的绝对路径
- os.path.exists() 传入路径,如果文件存在返回True,不存在就返回False
- os.path.isdir() 传入路径,判断是否是目录
- os.path.join() 传入多个路径,可以拼接在一起
1 | import os |
C.os.pathlib库
1 | from pathlib import Path |