day19-常用模块IV(re、typing)
re模块
用来从字符串(文本)中查找特定的东西
1.元字符:有特殊意义的字符
- ^ 从开头匹配
import re
a = re.findall('^abc', 'abcsds')
b = re.findall('^abc', 'aabcsds') # 不是以abc开头,所以返回空
print(a,b)
['abc'] []
- $ 从末尾开始匹配
a = re.findall('abc$', 'sdfabcsdsabc')
b = re.findall('abc$', 'aabcsdsbc') # 不是以abc结尾,所以返回空
print(a,b)
['abc'] []
- | 相当于或者or
a = re.findall('a|bc', 'sdfabbcsdsabc') # 将匹配到的对象用列表的形式返回
print(a)
['a', 'bc', 'a', 'bc']
- [] 找到[]内的元素
a = re.findall('[bac]', 'sdfabcsdsabc')
print(a)
['a', 'b', 'c', 'a', 'b', 'c']
- [^] 取反,匹配出除[]里面的字符,元字符如果写到字符集里就是反取
a = re.findall('[^bac]', 'sdfabcsdsabc')
print(a)
['s', 'd', 'f', 's', 'd', 's']
- () 找到匹配的结果后,只取()内的,分组匹配
a = re.findall('a(bc)s', 'sdfabcsdsabc')
print(a)
['bc']
- . 表示任意一个字符
a = re.findall('b.', 'sdb,sdb sdkjfbasd sdb') # 可表示任意字符,包括空格及其他字符
print(a)
['b,', 'b ', 'ba']
- {n} 将大括号前面最近的第一个字符匹配n次
a = re.findall('ab{3}','abbbbsfsabbs dfbbb')
print(a)
- {n,} 将大括号前面最近的第一个字符匹配n次或大于n次
a = re.findall('b{2,}','abbbbsfsabbs dfbbb')
print(a)
['bbbb', 'bb', 'bbb']
- {n,m} 将大括号前面最近的第一个字符匹配n到m次
a = re.findall('b{2,3}','abbbbsfsabbs dfbbb')
print(a)
['bbb', 'bb', 'bbb']
- * 前面字符匹配0到无穷个
a = re.findall('sa*','fsa dsaasdf')
print(a)
['sa', 'saa', 's']
- + 前面的字符匹配1到无穷个
a = re.findall('a+','fsa dsaasdf') # 至少要匹配到一个a
print(a)
['a', 'aa']
- ? 前面的字符匹配0个或1个
a = re.findall('sa?','fsa dsaasdf') # 匹配0或一个a
print(a)
['sa', 'sa', 's']
2.预定义字符:反斜杠后边跟普通字符实现特殊功能
- \d 匹配数字(0-9)
a = re.findall('\d', 'sda123jf 342 4sdf4')
print(a)
['1', '2', '3', '3', '4', '2', '4', '4']
- \D 匹配非数字的字符
a = re.findall('\D', 'sda123jf 342 4sdf4')
print(a)
['s', 'd', 'a', 'j', 'f', ' ', ' ', 's', 'd', 'f']
- \s 匹配空字符
a = re.findall('\s', 'sda123jf 342 4sd,f4')
print(a)
[' ', ' ']
- \S 匹配非空字符
a = re.findall('\S', 'sda123jf 342 4sd,f4')
print(a)
['s', 'd', 'a', '1', '2', '3', 'j', 'f', '3', '4', '2', '4', 's', 'd', ',', 'f', '4']
- \w 匹配字母、数字、下划线或汉字
a = re.findall('\w', 'sd_f 34?2 4sd,f4')
print(a)
['s', 'd', '_', 'f', '3', '4', '2', '4', 's', 'd', 'f', '4']
- \W 匹配非字母、非数字、非下划线、非汉字的字符
a = re.findall('\W', 'sd_f 34?2 4sd,f4')
print(a)
[' ', '?', ' ', ',']
3.贪婪匹配:一直找,直到不满足
a = re.findall('a.*', 'asda123456asa')
print(a)
['asda123456asa']
4.非贪婪匹配,找到一个就停止,?相当于停止符
a = re.findall('a.*?', 'asda123456asa')
print(a)
['a', 'a', 'a', 'a']
5.常用的功能函数
- re.complie 相当于写一个通用的规则模板
phone_compile = re.compile('1\d{10}')
email_compile = re.compile('\w+@\w+.\w+')
test_s = '12345678900 nickchen121@163.com 2287273393@qq.com'
res = phone_compile.findall(test_s)
print(res)
res = email_compile.findall(test_s)
print(res)
['12345678900']
['nickchen121@163.com', '2287273393@qq.com']
- re.match 从起始位置匹配,取一个匹配到的
a = re.match('\d','sdf123sdd456')
b = re.match('\d','123sdfa 212d')
print(a)
print(b)
None
<_sre.SRE_Match object; span=(0, 1), match='1'>
- re.search 搜索匹配到的第一个字符,并返回其索引
a = re.search('\d','sdfs1213hfjsf 2323')
print(a)
<_sre.SRE_Match object; span=(4, 5), match='1'>
match与search的区别:mathch从开头开始匹配找一个,search搜索所有找第一个
- re.split 根据正则匹配分割字符串,返回分割后的一个列表
s = 'asb sfsl sfjwo212 12312,dsfsf'
print(s.split(' '))
res = re.split('\d+',s)
print(res)
['asb', 'sfsl', 'sfjwo212', '12312,dsfsf']
['asb sfsl sfjwo', ' ', ',dsfsf']
- re.sub和re.subn 他们两都是替换内容,但是subn会计算替换了多少次,类似于字符串的replace内置方法
import re
s = 'asfhf12fdgds 743wiuw22'
print(re.sub('\d',',',s))
print(re.subn('\d',',',s)) # 除了会修改内容,还会返回修改了多少次
asfhf,,fdgds ,,,wiuw,,
('asfhf,,fdgds ,,,wiuw,,', 7)
typing模块
1.类型检查,防止运行时出现参数和返回值类型不符合。
2.作为开发文档附加说明,方便使用者调用时传入和返回参数类型。
3.该模块加入后并不会影响程序的运行,不会报正式的错误,只有提醒。
- 注意:typing模块只有在python3.5以上的版本中才可以使用,pycharm目前支持typing检查
from typing import List, Tuple, Dict
def add(a: int, string: str, f: float,
b: bool) -> Tuple[List, Tuple, Dict, bool]:
list1 = list(range(a))
tup = (string, string, string)
d = {"a": f}
bl = b
return list1, tup, d, bl
print(add(5, "hhhh", 2.3, False))
爬取音频
import re
import requests
response = requests.get('http://www.gov.cn/premier/index.htm')
data = response.text
res = re.findall('href="(/\w+/\w+_yp.htm)"', data) # ()只取括号内的
yp_res = 'http://www.gov.cn' + res[0]
yp_response = requests.get(yp_res)
yp_data = yp_response.text
res = re.findall('<a href="(.*?)"', yp_data)
count = 0
for url in res:
if url == 'javascript:;':
continue
mp3_url = 'http://www.gov.cn' + url
mp3_response = requests.get(mp3_url)
mp3_response.encoding = 'utf8' # 改变网址的utf8
mp3_data = mp3_response.text
# print(mp3_data)
res = re.findall('<title>(.*?)</title>|data-src="(.*?)"',mp3_data)
title = res[0][0]
mp3_url = res[1][1]
if res[1][1].startswith('/home'):
continue
res_response = requests.get(mp3_url)
mp3_data = res_response.content # MP3的二进制形式
with open(f'{title}.mp3','wb') as fw:
fw.write(mp3_data)
fw.flush()
count += 1
print(f'{count}')
day19-常用模块IV(re、typing)的更多相关文章
- day19常用模块2
常用模块21 shelve模块 也是一种序列化方式 使用方法 1.open sl = shelve.open("shelvetest.txt") ...
- day19:常用模块(collections,time,random,os,sys)
1,正则复习,re.S,这个在用的最多,re.M多行模式,这个主要改变^和$的行为,每一行都是新串开头,每个回车都是结尾.re.L 在Windows和linux里面对一些特殊字符有不一样的识别,re. ...
- 【转】python模块分析之typing(三)
[转]python模块分析之typing(三) 前言:很多人在写完代码一段时间后回过头看代码,很可能忘记了自己写的函数需要传什么参数,返回什么类型的结果,就不得不去阅读代码的具体内容,降低了阅读的速度 ...
- python模块分析之typing(三)
前言:很多人在写完代码一段时间后回过头看代码,很可能忘记了自己写的函数需要传什么参数,返回什么类型的结果,就不得不去阅读代码的具体内容,降低了阅读的速度,加上Python本身就是一门弱类型的语言,这种 ...
- python学习 day19 configparser模块 os模块 subprocess模块
上周五回顾 logging 用于记录日志 四种核心角色: 生成器Logger 过滤器Filter 处理器Handler 格式化处理器 Formatter logging.info.debug 使用默认 ...
- 20 Python 常用模块
collections模块 在内置数据类型(dict.list.set.tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter.deque.defaultdict. ...
- Python常用模块小结
目录 Python常用模块小结 一.Python常用模块小结 1.1 time模块 1.2 datetime模块 1.3 random模块 1.4 os模块 1.5 sys模块 1.6 json模块 ...
- atitit 商业项目常用模块技术知识点 v3 qc29
atitit 商业项目常用模块技术知识点 v3 qc29 条码二维码barcodebarcode 条码二维码qrcodeqrcode 条码二维码dm码生成与识别 条码二维码pdf147码 条码二维码z ...
- 《Ansible权威指南》笔记(3)——Ad-Hoc命令集,常用模块
五.Ad-Hoc命令集1.Ad-Hoc命令集通过/usr/bin/ansible命令实现:ansible <host-pattern> [options] -v,--verbose ...
- python学习笔记(5)--迭代器,生成器,装饰器,常用模块,序列化
生成器 在Python中,一边循环一边计算的机制,称为生成器:generator. 如: >>> g = (x * x for xin range(10)) >>> ...
随机推荐
- Android解析程序包时出现问题
Android用户下载我们wcc应用时,偶尔会出现“解析程序包出现问题”的的现象,以下是逐步排查的相关经验: 1. 首先确保这个包本身没有问题. 检测方法:其他手机采用同样的下载方式再下载一次. 解决 ...
- NSSet所有API学习。
/****************集合(NSSet)和数组(NSArray)有相似之处,都是存储不同的对象的地址.只是NSArray是有序的集合,NSSet是无序的集合,同一时候NSSet能够保证数据 ...
- Spring 之AOP 面向切面编程
AOP相关术语: Joinpoint (连接点):所谓连接点是指那些被拦截到的点,在spring中,这些点指的是方法,因为spring 只支持方法类型的连接点. Pointcut(切入点):所谓切入点 ...
- YTU 2516: 剪刀石头布
2516: 剪刀石头布 时间限制: 1 Sec 内存限制: 128 MB 提交: 193 解决: 123 题目描述 小慧小时候很喜欢和她的小伙伴们一起玩剪刀(Scissors).石头(Rock). ...
- 7-81 js课程小结
7-81 js课程小结 学习要点 理解全局对象 变量的作用范围 理解全局对象Global 全局属性和函数可用于所有内建的 JavaScript 对象.全局对象是所有全局方法的拥有者,用来统一管理全局方 ...
- 学习MAP 地图好地址
http://www.cnblogs.com/beniao/archive/2010/01/13/1646446.html Bēniaǒ成长笔记在IT江湖里我不是一名老手,我只是一名普通的程序员,愿意 ...
- AT2004 Anticube
https://www.zybuluo.com/ysner/note/1304774 题面 给定\(n\)个数\(s_i\),要求从中选出最多的数,满足任意两个数之积都不是完全立方数. \(n\leq ...
- 洛谷 P1970 花匠 —— DP
题目:https://www.luogu.org/problemnew/show/P1970 普通的DP,f[i][0/1] 表示 i 处处于较小或较大的长度: 注意:1.树状数组向后 query 时 ...
- win7 32位解决matlab out of memory问题
由于最近在做DL,matlab load数据时由于内存只有2G,会出现out of memory的情况,网上百度了下都是在xp下打开3GB来解决该问题,但是由于win7没有boot.ini无法在win ...
- 学生表、课程表、 成绩表 、教师表sql练习
转自:http://yuncode.net/code/c_58df7a8ca687e58 1.查询“1”课程比“2”课程成绩高的所有学生的学号: SELECT t1.student_id FROM ...