python刷题-关于日期、正则表达式的题

1、计算日期范围内的所有日期

思路:用一个函数实现此功能
函数中,一个空列表用来储存,while循环,开始日期+间隔日期都变成日期类型

import datetime
def get.date_range(begin_date,end_date):
	date_list = []
	while begin_date<=end_date:
		date_list.append(begin_date)
		begin_date_o = datetime.datetime.strptime(begin_date,'%Y-%m-%d')
		timedelta = datetime.timelta(days=1)
		bgin_date  = (begin_date_o+timedelta).strftime('%Y-%m-%d')
	return date_list

begin_date = "2022-12-30"
end_date = "2023-01-4"
date_list = get.date_range(begin_date,end_date)
print(date_list)

2、将Unix时间戳转换为格式化日期

处理时间戳:datetime.datetime.fromtimestamp()
在这里插入图片描述

import datetime
unxi_time = 1620747224
datetime_obj = datetime.datetime.fromtimestamp(unix_time)
datetime_str = datetime_obj.strftime("%Y-%m-%d")
print(datetime_str)

3、计算日期数据周同比

同比:(后一个数-前一个数)/前一个数字
sales.txt内容:
日期 销售额
2022-12-11 96
2022-12-12 87
.。。。。

思路:
先将txt中数据读取到字典中,再处理
要获得日期对应的前7天日期–get_diff_days函数
从字典中取对应销售额,进行计算周同比

date_sale = {}
is_first_line = True
with open("./sales.txt") as fin:
	for line in fin:
		if is_first_line:
			is_first_line = False  #设置一个开关,判断是否是首行
			continue
		line = line[:-1]
		date,sale_number = line.split("\t") #中间的间隔是一个tab键\t
		date_sale[date] = float(sale_number) 
#先将txt中数据读取到字典中,再处理

#返回date的days天前的日期
def get_diff_days(date,days):
	curr_date = datetime.datetime.strptime(date,"%Y-%m-%d")
	timedelata = datetime.timedelta(days=-days)
	return (curr_date+timedelata).strftime("%Y-%m-%d")  #

for date,sale_number in date_sale.items():
	date7 = get_diff_days(date,7)  #获取7天前的日期
	sale_number7 = date_sale.get(date7,0) #days7对应的销售额,若不存在则取0
	if sale_number7 == 0:
		print(date,sale_number,0)
	else:
		weak_diff = (sale_number-sale_number7)/sale_number7
		print(date,sale_number,date7,sale_number7,weak_diff)

4、正则表达式判断字符串是否是日期

在这里插入图片描述

import re
def date_is_right(date):
	return re.math("\d{4}-\d{2}-\d{2}",date) is not None
	#如果没匹配到会返回None,如果匹配到了会返回一个东西,所以写成is not None只会返回True和False

date1 = "2022-05-20"
date2 = "202-05-20"
print(date1,date_is_right(date1))
print(date2,date_is_right(date2))

在这里插入图片描述

5、从文本中提取手机号码 --正则表达式

re.findall(文本,正则表达式)

content="百日以上就123,黄河12343567入海量,13123456789,13789872345"
import re
#手机号的模型:1开头,总共11位,第二位的数字3-9
pattern = r"1[3-9]\d{9}"
#r让\d不用转义,\d指数字
results =  re.findall(pattern,content)
print(results)   #输出:['13123456789', '13789872345']

6、批量提取网页上的手机号码

import re
pattern = r"1[3-9]\d{9}"
file_cont = ""
with open("./wenben.txt") as fin:
	file_cont = fin.read()  #利用read把文本内容全部拿出来
	
results = re.findall(file_cont,pattern)
print(len(results))
for result in results:
	print(result) #一行一个这样的输出

7、自动提取电子邮箱地址

#邮箱python666@163.com
import re
pattern = re.compile(r"""
	[a-zA-Z0-9_-]+
	@
	[a-zA-Z0-9]+
	\.
	[a-zA-Z]{2,4}
	""",re.VERBOSE)
#三引号和re.VERBOSE都是指允许多行编写
#+指一次及以上,{2,4}指2-4次

cont = "百日以上就123,黄河12343567入海量,python666@163.com"
results = re.findall(cont,pattern)
print(len(results))
for result in results:
	print(result) #一行一个这样的输出

8、验证用户密码是否规范-re.findall

长度–len
包含特殊字符–re.findall()

#密码规范:长度[6,20]之间,至少一个小写字母、一个大写字母、1个数字、一个特殊字符
import re
def check_password(password):
	if not 6 <= len(password) <=20:
		return False,"密码个数必须6-20"
	if not re.findall(r"[a-z]",password):
		return False,"必须包含至少1个小写字母"
	if not re.findall(r"[A-Z]",password):
		return False,"必须包含至少1个大写字母"
	if not re.findall(r"[0-9]",password):
		return False,"必须包含至少1个数字"
	if not re.findall(r"[^a-zA-Z0-9]",password):
		return False,"必须包含至少1个特殊字符"
	return True,None

print("Helloworld#666",check_password("Helloworld#666"))
print("Helloworld#",check_password("Helloworld#"))
print("elloworld#666",check_password("elloworld#666"))
print("Helloworld666",check_password("Helloworld666"))

在这里插入图片描述

9、提取商品价格

正则中括号的使用
mach.group(1)

content = """
小米上街买菜
买了1斤黄瓜花了8元;
买了2斤葡萄花了13.5元;
买了3斤白菜花了5.4元;
"""
#想从中提取出:(1、黄瓜、8)(2、葡萄、13.5)(3、白菜、5.4)
import re
for line in content.split("\n"):
	pattern =r"(\d)斤(.*)花了(\d+(\.\d+)?)元"
	#\d是数字,.*是多个字符,?是可有可无.最后给要提取的内容都打上括号
	match = re.search(pattern,line)
	if match:
		print(f"{mach.group(1)}\t{mach.group(2)}\t{mach.group(3)}")#输出括号1,2,3内容
		#print(match.groups())
	print(line)

在这里插入图片描述

10、给文章中手机号打马赛克效果-re.sub

文本中满足某格式的内容被替换:
re.sub(被替换满足的格式,要替换成的格式,文本内容)

content = """
白日依山19878923487尽,黄河入14896787652海流.
欲穷千1234里目,更上一15768082341层楼.
"""
#将内容中满足手机号格式的内容换成*
import re
pattern = r"(1[3-9])\d{9}" #将前两个数字括号起来了
print(re.sub(pattern,r"\1****",content)) #\1指前面的第一个括号中内容

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值