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. 【C语言】推断一个数是否为2的n次方

    //推断一个数是否为2的n次方 #include <stdio.h> int is_two_n(int num) { if ((num&(num - 1))) //去掉一个1,推断 ...

  2. XML(一)语法

    一.xml语法 1.文档声明 2.元素 3.属性 4.凝视 5.CDATA区.转义字符 6.处理指令 1.文档声明: 用来声明xml的基本属性,用来指挥解析引擎怎样去解析当前xml 通常一个xml都要 ...

  3. 字符识别OCR研究一(模板匹配&amp;BP神经网络训练)

    摘 要 在MATLAB环境下利用USB摄像头採集字符图像.读取一帧保存为图像.然后对读取保存的字符图像,灰度化.二值化,在此基础上做倾斜矫正.对矫正的图像进行滤波平滑处理,然后对字符区域进行提取切割出 ...

  4. [办公应用]如何将excel合并单元格分拆后每个单元格上仍保留数据?

    合并单元格虽然美观,但是无法进行排序.筛选等操作. 只有合并单元格拆分后才可以按常规进行统计.但是普通拆分后,excel仅保留合并单元格数据到区域左上角的单元格. 解决方案:选定多个合并单元格,应用本 ...

  5. [计算机]如何在win7下查看并更改文件的默认后缀名

    如何在win7下查看默认文件的后缀名并更改呢? 例如有一个文件本来是exe,想变更为txt.但是无法看到后缀名,就无法更改. 双击桌面上的计算机图标,或者任意盘符界面,单击如下图左侧“组织”右侧的下拉 ...

  6. 洛谷 P1383 高级打字机==codevs 3333 高级打字机

    P1383 高级打字机 18通过 118提交 题目提供者yeszy 标签倍增图论高级数据结构福建省历届夏令营 难度省选/NOI- 提交该题 讨论 题解 记录 最新讨论 暂时没有讨论 题目描述 早苗入手 ...

  7. Hibernate - Query简易

    package cn.demo; import java.util.List; import org.hibernate.Query; import org.hibernate.Session; im ...

  8. P1198 [JSOI2008]最大数(线段树)

    P1198 [JSOI2008]最大数(线段树) 题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值 ...

  9. 【Codeforces】665E Beautiful Subarrays

    E. Beautiful Subarrays time limit per test: 3 seconds memory limit per test: 512 megabytes input: st ...

  10. bzoj1604

    treap+并查集 我们能想到一个点和最近点对连接,用并查集维护,但是这个不仅不能求,而且还是不对的,于是就看了题解 把距离转为A(x-y,x+y),这样两点之间的距离就是max(x'-X',y'-Y ...