目录标题
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指前面的第一个括号中内容