取消转义
在原生的正则表达式中取消转义推荐使用\,每个\只能取消一个字符的转义
在Python中取消转义推荐使用r,也可以使用\
Python内置模块之er模块
在Python中要使用正则表达式必须借助于模块er # er模块只是可以使用正则之一
基础操作方法
import er # 调用er模块
1.re.findall('正则表达式','待匹配的文本') # 根据正则匹配筛选出所有符合条件的数据
res = re.finadll('正则表达式','待匹配的文本')
print(res) # 匹配的结果为列表,没有则空列表
2.re.search('正则表达式','待匹配的文本') # 根据正则匹配筛选出符合条件的第一个数据然后结束
res = re.search('正则表达式','待匹配的文本')
print(res) # 匹配结果<_sre.SRE_Match object; span=(2, 3), match='b'> span跨越两个字符,在第三个字符找到的,没有内容会返回None
print(res.gropu()) # 需要借助gropu取出需要的数据。结果为 b。没有内容会报错
if res: # 判断返回的是不是None,如果有值就走下面,直接打印出来
print(res.gropu())
else: # 没有值走下面,不会打印,同样不会报错
print('没有目标')
3.re.match('正则表达式','待匹配的文本) # 根据正则从头开始匹配,文本内容必须开头匹配上
res = re.match('a','abcd')
print(res) # <_sre.SRE_Match object; span=(0, 1), match='a'> span跨越0个字符,在第一个字符找到目标,没有目标会返回None
print(res.gropu()) # 有值就会打印,没值同样会报错
可以使用if 方法判断有没有值,并且不会报错
re模块常用操作
import re
1.re.split('正则表达式','文本') # 切割出文本内根据正则筛选出的目标,保留剩下内容。与切割之后的结果形成列表
res = re.split('[ab]','vbfgbggbggg')
print(res) # ['v', 'fg', 'gg', 'ggg'] 如果目标在开头或者结尾,则出现列表呢的空字符串,在中间则直接切除,形成列表re.split('[ab]','avbfgbggbgggb') ['', 'v', 'fg', 'gg', 'ggg', '']
2.re.sub('正则表达式','待替代内容','文本') # 类似字符串汇中replace方法。将正则筛选出的文本内容替换为'待替代内容'
res = re.sub('\d','真的?','sdfwegsd62dsfsdg54') # 代替结果为字符串
print(res) # #sdfwegsd真的?真的?dsfsdg真的?真的?
res = re.sub('\d','真的?','sdfwegsd62dsfsdg54',1) # 后面的参数为替换几个,超出文本内容也不会报错
print(res) # sdfwegsd真的?真的?dsfsdg54
3.re.subn('正则表达式','待替代内容','文本') #
res = re.sub('\d','真的?','sdfwegsd62dsfsdg54',3454)
print(res) # ('sdfwegsd真的?真的?dsfsdg真的?真的?', 4),返回元组,提示替换几个,不会报错
#可以通过索引取出其中元素,文本变成字符串,替换次数为整形
4.re.compile('\d+') # 提前将正则表达式写入
res = res.compile('\d+') # 将正则表达式赋值给res
res1 = res.findall('文本内容') # 可以直接输入文本
5.re.finditer #find 发现 iter 转换为迭代器对象
res = re.finditer('\d+','ashdklah21h23kj12jk3klj112312121kl131') # 将正则表达式匹配到的目标转换为迭代器对象
print(res) # <callable_iterator object at 0x0000013A4DFCA278> 迭代器对象
print(i for i in res) # <generator object <genexpr> at 0x000001A7DC5ABBF8>
print(list(i for i in res)) # 取出来的每个值,告知是在哪个位置找到的
print(list(i.group() for i in res)) # ['21', '23', '12', '3', '112312121', '131']转化为列表,需要列表生成式
print([i.group() for i in res]) # 里面的值取出来之后就会变成空列表。不会在取出数据
'''重点:finditer,转换之后需要列表生成式+group()之后才可以指出来数据'''
6.re.search('正则','文本')
res = res = re.search('^[1-9](\d{14})(\d{2}[0-9x])?$','110105199812067023')
print(res)
print(res.group()) # 110105199812067023 取出全部的组就是括号
print(res.group(1)) # 10105199812067 取出一个组。第一个的括号
print(res.group(2)) # 023 取出一个组,第二个括号
正则实战
import re
# 爬取红牛国内分公司的公司名称,公司地址,公司邮箱,公司电话
# 1.http://www.redbull.com.cn/about/branch
# 2.查看网页源码,将数据复制到代码同层目录,创建.txt文件
# 3.之后运行代码
# 1.将文件取出
# 打开文件
with open(r'a.txt','r',encoding='utf8') as f:
# 取出所有内容
l1 = f.read()
# print(l1)
# 2.文件取出之后利用正则匹配
res = re.findall('<h2>(.*?)</h2>',l1)
# print(res)
res1 = re.findall('''<p class='mapIco'>(.*?)</p>''',l1)
# print(res1)
res2 = re.findall('''<p class='mailIco'>(.*?)</p>''',l1)
# print(res2)
res3 = re.findall('''<p class='telIco'>(.*?)</p>''',l1)
# print(res3)
# 3.取出来的是列表,将每个列表拉链组织起来
res0 = zip(res,res1,res2,res3)
# print(res0)
# 4.打印组合好的列表
for i in res0:
print('''
公司名称:%s
公司地址:%s
公司邮编:%s
公司电话:%s
'''%(i[0],i[1],i[2],i[3]))
collections模块
该模块提供一些高阶的数据类型 ps:常见数据类型的进阶
1.namedtuple(具名元组)
from collections import namedtuple
# 使用方法
namedtuple('名称',['名字1','名字2','...'])
namedtuple('名称','名字1,名字2,...')
res = namedtuple('坐标',x,y) # 将整体的名称填入,在将每个分支填入。
res1 = res(数据1,数据2) # 输入分支的数据
print(res1) # 坐标(x=数据1,y=数据2) 打印整体
print(res1.x) # 数据1
print(res1.y) # 数据2
2.deque(双端队列)
deque() # 添加列表元素
.append() # 从右边往列表里添加元素
.appendleft() # 从左边往列表里添加元素
res = deque([11,22,33])
res.append()
res.apppendleft()
res.pop() # 从右边取值
res.popleft() # 从左边取值
3.OrderedDict(有序字典) # 字典本身是无序的,但在pycharm中自动给字典排序了
from collections import OrderedDict
normal_dict = dict([('name', 'jason'), ('pwd', 123), ('hobby', 'study')]) # 列表转换字典
print(normal_dict)
order_dict = OrderedDict([('name', 'jason'), ('pwd', 123), ('hobby', 'study')]) # 列表转化字典
print(order_dict)
OrderedDict([('name', 'jason'), ('pwd', 123), ('hobby', 'study')])
order_dict['xxx'] = 111
print(order_dict) # 转字典之后添加元素
OrderedDict([('name', 'jason'), ('pwd', 123), ('hobby', 'study'), ('xxx', 111)])
order_dict['yyy'] = 222
print(normal_dict)
5.defaultdict(默认值字典)
from collections import defaultdict
values = [11, 22, 33,44,55,66,77,88,99,90]
my_dict = defaultdict(list) # 创建一个默认字典,里面的V键是列表
for value in values:
if value>60:
my_dict['k1'].append(value) # 判断原列表的数据大于60,放入字典中,K键是K1,V键就是列表,将元素添加到列表中
else:
my_dict['k2'].append(value)
print(my_dict)
6.Counter(计数器)
# 常用办法
res = 'fsfsgdfdfgdsgsdfs'
# 统计字符串中每个字符出现的次数组织成字典。
res = 'fsfsgdfdfgdsgsdfs'
# 创建一个空字典
dic = {}
# 循环字符串
for i in res:
# 如果取出来的值没有在字典里,就形成一个键值对
if i not in dic:
# i为K,1为V
dic[i] = 1
else:
# 如果在就将字典里面的V加1
dic[i] +=1
print(dic)
# Counter计数器
res = [1,1,2,4,4,4,4,4,5]
ret = Counter(res) # 可以计数可迭代对象
print(ret) # 打印出来的还是字典
queue模块
queue(队列) # 队列模块
import queue # 内置对立模块:FIFO
# 初始化队列 创造一个队列
1.res = queue.Queue() # 括号内可以填入数字,表示可以放入几个值
2.put() # 添加元素
res.put('1')
res.put('2')
3.get() # 取出元素
res.get()
res.get() # 先进先出
res.get() # 没有值之后不会报错,但程序不会结束,会停住,等待新的值填入
time模块
时间三种表现形式
1.时间戳
2.结构化时间(计算机知道的时间)
3.格式化时间(人类知道的时间)
三种时间是可以相互转换的!!!
1.time.sleep() # 原地阻塞指定的秒数
2.time.time() # 获取时间戳时间
import time
格式化时间
time.strftime('%Y-%m-%d') # 2021-11-25
time.strftime('%Y-%m-%d %H:%M:%S') # 2021-11-25 18:50:35
time.strftime('%Y-%m-%d %X') # 2021-11-25 18:50:35
结构化时间
print(time.localtime()) 本地时间(东八区)
print(time.gmtime()) 东0区时间
datetime模块
import datetime
print(datetime.date.today()) # 2021-11-25 当天的时间
print(datetime.datetime.today()) # 2021-11-25 19:18:48.752896
'''date年月日,datetime年月日时分秒,time时分秒'''
res = datetime.datetime.today()
print(res.year) # 2021
print(res.month) # 11
print(res.day) # 25
print(res.weekday()) # 获取星期(weekday星期是0-6) 0表示周一
print(res.isoweekday()) # 获取星期(weekday星期是1-7) 1表示周一
时间差(timedelte)
import datetime
res = datetime.datetime.today() # 当前时间
res1 = datetime.timedelta(days=3) # 距离当前三天的时间()内填写年月时时分秒都可以
print(res) # 2021-11-25 19:25:36.514087
print(res1) # 3 days, 0:00:00
print(res + res1) # 2021-11-28 19:25:36.514087 今天时间加上三天后的时间
print(res + res1) # 2021-11-22 19:27:22.980653 今天的时间减去三天的时间
日期对象 = 日期对象 +/- timedelta对象
timedelta对象 = 日期对象 +/- 日期对象
'UTC时间与我们的东八区时间差 八个小时'