内置re模块
在python要想使用正则表达式必须借助 模块,re就是其中之一
基本操作方法:import re
re.findall('正则表达式','待匹配的文本') # 根据正则匹配出所有符合条件的数据
res = re.findall('a','eva jason jackson')
print(res) # ['a','a','a'] 结果就是一个列表(要么有元素,要么空列表)
res = re.search('正则表达式','待匹配的文本') # 根据正则匹配到一个符合条件的就结束
res =re.search('a','eva jason jackson')
print(res) # 结果对象:<_sre.SRE_Match object;span=(2,3),match='a'>
print(res.group()) # 真正的结果 :a
"""如果不符合条件的数据,那么search返回None 并且使用group会直接报错"""
避免报错
if res:
print(res.group())
else:
print('没找到')
res = re,match('a','abca') # 根据正则从头开始匹配(文本内容必须在开头匹配上)
print(res)
print(res.group())
"""如果没有符合条件的数据 那么match返回None 并且使用group会直接报错"""
if res:
print(res.group())
else:
print('没找到')
re模块其他方法
import re
先按'a'分割得到''和'bcd'分别按'b'分割
res = re.splist('[ab]','abcd')
print(res) # ['','','cd']
类似字符串类型的replace方法
res = re.sub('\d','H','eva3jason4yuan4',1) #替换正则匹配到的内容
print(res) # evaHjason4yuan4
res = re.sub('\d','H','eva3jason4yuan4') # 不写默认替换所有
print(res) # evaHjasonHyuanH
"""返回元组 并提示替换了几处"""
res = re.subn('\d','H','eva3jason4yuan4,1')
print(res) #('evaHjason4yuan4',1)
res = re.subn('\d','H','eva3jason4yuan4')
print(res) #('evaHjasonHyuanH',3)
"""常用"""
regexp_obj = re.compile('\d+')
res = regexp_obj.search('absd213j1hjj213jk')
res1 = regexp_obj.match('123hhkj2h1j3123')
res2 = regexp_obj.findall('1213k1j2jhj21j3123hh')
print(res,res1,res2)
"""常用"""
res = re.finditer('\d+','ashdklah21h23kj12jk3klj112312121kl131')
print([i.group() for i in 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
'''常用'''
findall针对分组优先展示 无名分组
res = re.findall("^[1-9]\d{14}(\d{2}[0-9x])?$",'110105199812067023')
print(res) # ['023']
取消分组优先展示 无名分组
res1 = re.findall("^[1-9](?:\d{14})(?:\d{2}[0-9x])?$",'110105199812067023')
print(res1)
有名分组
res = re.search('^[1-9](?P<xxx>\d{14})(?P<ooo>\d{2}[0-9])?$','321322199001012672')
print(res)
print(res.group()) # 321322199001012672
print(res.group(1)) # 21322199001012 无名分组的取值方式(索引)
print(res.group('xxx')) # 21322199001012 指名道姓取
print(res.group('ooo')) # 672 指名道姓
正则实战案列
import re
# 读取带匹配的数据
with open(r'a.txt', 'r', encoding='utf8') as f:
data = f.read()
# 利用正则匹配数据
# 分公司名称
title_list = re.findall('<h2>(.*?)</h2>', data)
# print(title_list)
# 分公司地址
address_list = re.findall("<p class='mapIco'>(.*?)</p>", data)
# print(address_list)
# 分公司邮箱
email_list = re.findall("<p class='mailIco'>(.*?)</p>", data)
# print(email_list)
# 分公司电话
phone_list = re.findall("<p class='telIco'>(.*?)</p>", data)
res = zip(title_list, address_list, email_list, phone_list)
for data_tuple in res:
print("""
公司名称:%s
公司地址:%s
公司邮箱:%s
公司电话:%s
""" % (data_tuple[0], data_tuple[1], data_tuple[2], data_tuple[3]))
collections模块
# 该模块内部提供了一些高阶的数据类型
1、namedtuple(具名元组)
from collections import namedtuple
"""
namedtuple('名称',[名字1,名字2,...])
nametuple('名称','名字1 名字2 ...')
"""
point = namedtuple('坐标',['x','y'])
res = point(11,22)
print(res) #坐标(x=11,y=22)
print(res.x) # 11
print(res.y) # 22
point = nametuple('坐标','x y z')
res = point(11,22,33)
print(res) # 坐标(x=11,y=22,z=33)
print(res.x)
print(res.y)
print(res.z)
card = nametuple('扑克','花色 点数')
card1 = card('♠','A')
card2 = card('♥','K')
print(card1)
print(card1.花色)
print(card1.点数)
2、队列
# 队列模块
import queue # 内置队列模块:FIFO
# 初始化队列
q = queue.Queue()
# 往队列中添加元素
q.put('first')
q.put('second')
q.put('third')
# 从队列中获取元素
print(q.get())
print(q.get())
print(q.get())
print(q.get()) # 值取没了就会原地等待
3.双端队列
from collections import deque
q = deque([11,22,33])
q.append(44) # 从右边添加
q.appendleft(55) # 从左边添加
print(q.pop()) # 从右边取值
print(q.popleft()) # 从做边取值
4、有序字典
normal_dict = dict([('name', 'jason'), ('pwd', 123), ('hobby', 'study')])
print(normal_dict)
{'hobby': 'study', 'pwd': 123, 'name': 'jason'}
from collections import OrderedDict
order_dict = OrderedDict([('name', 'jason'), ('pwd', 123), ('hobby', 'study')])
print(order_dict)
OrderedDict([('name', 'jason'), ('pwd', 123), ('hobby', 'study')])
order_dict['xxx'] = 111
order_dict
OrderedDict([('name', 'jason'), ('pwd', 123), ('hobby', 'study'), ('xxx', 111)])
normal_dict['yyy'] = 222
normal_dict
{'hobby': 'study', 'pwd': 123, 'yyy': 222, 'name': 'jason'}
5.默认值字典
from collections import defaultdict
values = [11, 22, 33,44,55,66,77,88,99,90]
my_dict = defaultdict(list)
for value in values:
i
if value>60:
my_dict['k1'].append(value)
else:
my_dict['k2'].append(value)
print(my_dict)
6.计数器
res = 'abcdeabcdabcaba'
统计字符串中每个元素出现的次数
new_dict = {}
for i in res:
if i not in new_dict:
new_dict[i] = 1
else:
new_dict[i] += 1
print(new_dict)
from collections import Counter # 计数器
ret = Counter(res)
print(ret)
time模块
"""
时间三种表现形式
1、时间戳(秒数)
2、结构化时间(一般是给机器看的)
3、格式化时间(一般是给人看的)
三种时间是可以相互转换的!
"""
1、time.sleep() 原地阻塞指定的秒数
2、time.time() 获取时间戳时间
格式化时间
import time
print(time.strftime('%Y-%m-%d')) # 2021-11-25
# 时间单位:年-月-日
print(time.strftime('%Y-%m-%d %H:%M:%S')) # 2021-11-25 11:48:34
# 时间单位: 年-月-日 时-分-秒
print(time.strftime('%Y-%m-%d %X')) # 2021-11-25 11:48:34
# 时间单位:年-月-日 (%X:时-分-秒)
"""
更多时间相关符号 保存到容易查找的位置即可
"""
print(time.localtime())
time.struct_time(
tm_year=2021,
tm_mon=11,
tm_mday=25,
tm_hour=11,
tm_min=51,
tm_sec=25,
tm_wday=3,
tm_yday=329,
tm_isdst=0)
print(time.time())
print(time.gmtime(11111111111))
print(time.localtime())
datetime模块
import time
print(datetime.date.today()) # 2021-11-25
print(datetime.datetime.today) # 2021-11-25 12:25:11.969969
"""date年月日 datetime年月日时分秒 time时分秒(MySQL django后期可以)"""
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表示周一
"""时间差(timedelta)"""
ctime = datetime.datetime.today()
time_tel = datetime.timedelta(days=3)
print(ctime) # 2021-11-25 12:20:48.570489
print(ctime - time_tel) # 2021-11-22 12:21:06.712396
print(ctime + time_tel) # 2021-11-28 12:21:06.712396
"""
日期对象 = 日期对象 +/- timedelta对象
timedelta对象 = 日期对象 +/- 日期对象
"""
ret = ctime + time_tel
print(ret - ctime) # 3 days, 0:00:00
print(ctime - ret) # -3 days, 0:00:00
小练习 计算举例今年过生日还有多少天
birthday = datetime.date(2000, 11, 11)
now_date = datetime.date.today()
days = birthday - now_date
print('距离生日还有{}天'.format(days))
UTC时间与我们的东八区时间差 八个小时
print(datetime.datetime.now()) # 2021-11-25 12:25:33.579310
print(datetime.datetime.utcnow()) # 2021-11-25 04:25:33.579310