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)的更多相关文章

  1. day19常用模块2

    常用模块21 shelve模块  也是一种序列化方式    使用方法        1.open     sl = shelve.open("shelvetest.txt")   ...

  2. day19:常用模块(collections,time,random,os,sys)

    1,正则复习,re.S,这个在用的最多,re.M多行模式,这个主要改变^和$的行为,每一行都是新串开头,每个回车都是结尾.re.L 在Windows和linux里面对一些特殊字符有不一样的识别,re. ...

  3. 【转】python模块分析之typing(三)

    [转]python模块分析之typing(三) 前言:很多人在写完代码一段时间后回过头看代码,很可能忘记了自己写的函数需要传什么参数,返回什么类型的结果,就不得不去阅读代码的具体内容,降低了阅读的速度 ...

  4. python模块分析之typing(三)

    前言:很多人在写完代码一段时间后回过头看代码,很可能忘记了自己写的函数需要传什么参数,返回什么类型的结果,就不得不去阅读代码的具体内容,降低了阅读的速度,加上Python本身就是一门弱类型的语言,这种 ...

  5. python学习 day19 configparser模块 os模块 subprocess模块

    上周五回顾 logging 用于记录日志 四种核心角色: 生成器Logger 过滤器Filter 处理器Handler 格式化处理器 Formatter logging.info.debug 使用默认 ...

  6. 20 Python 常用模块

    collections模块 在内置数据类型(dict.list.set.tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter.deque.defaultdict. ...

  7. Python常用模块小结

    目录 Python常用模块小结 一.Python常用模块小结 1.1 time模块 1.2 datetime模块 1.3 random模块 1.4 os模块 1.5 sys模块 1.6 json模块 ...

  8. atitit 商业项目常用模块技术知识点 v3 qc29

    atitit 商业项目常用模块技术知识点 v3 qc29 条码二维码barcodebarcode 条码二维码qrcodeqrcode 条码二维码dm码生成与识别 条码二维码pdf147码 条码二维码z ...

  9. 《Ansible权威指南》笔记(3)——Ad-Hoc命令集,常用模块

    五.Ad-Hoc命令集1.Ad-Hoc命令集通过/usr/bin/ansible命令实现:ansible <host-pattern> [options]    -v,--verbose  ...

  10. python学习笔记(5)--迭代器,生成器,装饰器,常用模块,序列化

    生成器 在Python中,一边循环一边计算的机制,称为生成器:generator. 如: >>> g = (x * x for xin range(10)) >>> ...

随机推荐

  1. 一个python自动化测试的例子

    http://blog.csdn.net/galen2016/article/details/70882483 https://www.cnblogs.com/TankXiao/category/47 ...

  2. Redis3.0--集群安装部署

    准备环境 操作系统:CentOS6.5  Redis3.0.0 192.168.3.154 192.168.3.158 192.168.3.160 192.168.3.162 一.安装 安装文件夹 / ...

  3. 危险的kill

    . ps -aux | grep -E "chk.*url.*py" | cut -c 10-15 | xargs kill -9 ps -x | grep -E "ch ...

  4. js执行“按回车”的动作

    <textarea class="W_input" style="overflow: hidden; height: 23px;" node-type=& ...

  5. SGU 145

    节点不可重复经过的K短路问题. 思路:二分路径长度,深搜小于等于路径长度的路径数.可以利用可重复点K短路问题中的A*函数进行剪枝. 尝试另一种解法:把可重复点K短路A*直接搬过来,堆中的每个元素额外记 ...

  6. mongodb AND查询遇到多个index时候可能会做交集——和复合索引不同

    关于MongoDB中索引文档的一个问题? - To illustrate index intersection, consider a collection orders that has the f ...

  7. hdoj--1379--DNA Sorting(排序水题)

     DNA Sorting Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) T ...

  8. 【JSOI 2011】 分特产

    [题目链接] 点击打开链接 [算法] 考虑求每个人可以不分的方案 那么,对于每件物品,我们把它分成n份,每一份对应分给每一个人,有C(a[i]+n-1,m-1)种方案,而总方案数就是每种 物品方案数的 ...

  9. JavaSwing输入对话框,点击取消抛出异常的解决方法

    在做产品管理系统的时候,遇到一个问题: 在得到一个输入框对话框的时候 String textPrice = JOptionPane.showInputDialog("请输入要调整的价格增(减 ...

  10. 10.27night清北刷题班

    /* 枚举每个部分的总和,利用前缀和进行检验. 如果能分成4部分就一定能分成2部分,就筛了一边素数优化.清空数组!!! */ #include<bits/stdc++.h> #define ...