邵邵。

导航

内置模块

取消转义

在原生的正则表达式中取消转义推荐使用\,每个\只能取消一个字符的转义
在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时间与我们的东八区时间差 八个小时'

posted on 2021-11-25 19:35  邵邵。  阅读(59)  评论(0)    收藏  举报