正则表达式

# 按照邮件地址的格式(用户名@域名.后缀)来编写正则表达式

# 该正则表达式中包含了四个部分:

# 1. 用户名:由一个或多个字母、数字、下划线、点、减号组成,且必须以字母或数字开头(用于描述用户名的部分用小括号括起来)

# 2. @符号:该部分只包含一个@符号

# 3. 域名:由一个或多个字母、数字、下划线、点组成,且必须以字母或数字开头(用于描述域名的部分用小括号括起来)

# 4. 后缀:由一个或多个字母组成,且必须以字母开头(用于描述后缀的部分用小括号括起来)

# 在线正则表达式测试 https://tool.oschina.net/regex/?optionGlobl=global(所有邮箱可参考这个网址到这个撒哈拉沙漠输入邮箱地址可以 。查找出所有合法正确的邮件地址)

# 方法①
import os
import re

text = "工作邮箱是:abc@123.com,生活中经常使用邮箱 abc@.com,个人邮箱:Python@123.com,工作顺利..."
# 使用正则表达式查找所有合法的邮件地址
email_addresses = re.findall(r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b', text)
# 输出查找到的邮件地址
print("合法的邮件地址:", email_addresses)

# 方法①
import os
import re

text = "工作邮箱是:abc@123.com,生活中经常使用邮箱 abc@.com,个人邮箱:Python@123.com,工作顺利..."
# 使用正则表达式查找所有合法的邮件地址
email_addresses = re.findall(r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b', text)
# 输出查找到的邮件地址
print("合法的邮件地址:", email_addresses)

2. 网页中有一段字符串为:’sp>chl>个人信息 1811 * * * *589</h1><span>姓名:DingY,电话1871****111</span></p 使用正则表达式元成如下要求。

①提取宇符串中<span>标签里的内谷。

②提取其中所有的手机号

import re

# 定义字符串
s = 'p<h1>个人信息 18111234589</h1><span>姓名:DingY,电话187111001111</span></p'
# 获取<span>标签内的所有数据
info = re.search(r'(?<=<span>).*(?=</span>)', s)
print("span标签内的所有数据:")
print(info.group(0))
# 提取所有手机号码
phone = re.findall(r'1[34578]\d{9}', s, re.S)
print("所有的手机号码:", phone)

3、文档中有一个记事本文件,文件名为out_2021.03.24.txt,使用正则表达式读取文件名中的日期时间信息,并找出这一天是周几。将文件改名为out_YYYY-MM-DD-W.txt (其中YYYY:四位的年,MM:两位的月份,DD:两位的日,W:一位的周几,并假设周一为一周第一天)。

filename = "out_2021.03.24.txt"
# 匹配年月日信息
pattern = re.compile(r"out_(\d{4})\.(\d{2})\.(\d{2})\.txt")
match = pattern.match(filename)
if match:
# 获取年月日信息
year = match.group(1)
month = match.group(2)
day = match.group(3)
print("读取文件名中的日期时间信息:")
print(f"year: {year}, month: {month}, day: {day}")
# 计算这一天是周几
date = datetime.date(int(year), int(month), int(day))
print(f"weekday(这一天是周几): {date.strftime('%w')}")
# 构造新的文件名
new_filename = f"out_{year}-{month}-{day}-{date.strftime('%w')}.txt"
# 修改文件名,新的文件名将会替代原来的文件名,并保存在当前目录下
os.rename(filename, new_filename)
print("修改后的文件名将会保存到当前目录下")

其中YYYY:四位的年,MM:两位的月份,DD:两位的日,W:一位的周几,并假设周一为一周第一

修改后的文件名将会替换并保存到当前目录下out_YYYY-MM-DD-W.txt,

运行代码的时候把红色框框中文件删除再运行,否则会报错

输出日期的方法
# import os
# import re
# from datetime import datetime

# 定义文件名
# filename = "out_2021.03.24.txt"

# 使用正则表达式解析文件名中的日期时间信息
# result = re.match(r'out_(\d{4})\.(\d{2})\.(\d{2})\.txt', filename)

# 将解析后的年、月、日信息转换为 datetime 对象
# date = datetime.strptime(f"{result.group(1)}-{result.group(2)}-{result.group(3)}", "%Y-%m-%d")

# 输出这一天是周几
# print(date.strftime("%A"))

、已有文件内容如附件个人信息所示,请使用正则表达式实现如下要求:

①提取所有日期

②提取所有 1996 年以前出生的信息

③重新排版,日期规范为“yyyy年M月d日”

④把所有1996年以前出生的年份改为1996

⑤提取生日格式:张伟的生日是11月15号

 

import re

name_date = ""
with open('name-date.txt', encoding='UTF-8') as f:
for l in f:
name_date += "".join(l.split("\n")) + "\n"
date = re.findall("\d{4}[年.-]?\d{1,2}[月.-]?\d{1,2}\S?", name_date)
# print('所有日期:')
# print(date)

# 重新排版, 日期规范 为“yyy年M月d日”
formatted_dates = re.sub("\s*(\S+)\s+(\d{4})[年.-]?(\d{1,2})[月.-]?(\d{1,2})\S?", r"\1 \t \2年\3日\4日\n", name_date)
# print('\n重新排版后日期规范为:')
# print(formatted_dates)

# 提取所有 1996 年以前出生的学生
born_before_1996 = re.findall("\S+\s+1\d{2}[0-5][年.-]?\d{1,2}[月.-]?\d{1,2}\S?", name_date)
# print('\n1996年以前出生的信息:')
# print(born_before_1996)

# 把所有1996年以前出生的年份改为1996
birth_year_replace_pattern = re.compile(r'(19\d{2})年')
replaced_text = birth_year_replace_pattern.sub('1996年', name_date)
# print('\n把所有1996年以前出生的年份改为1996:')
# print(replaced_text)
# 提取生日格式
# ① 由于 name_date.txt没有"张伟的生日是11月15号“匹配不到,所以可以把原文本“ 张伟 1996.11.15””改为“ 张伟 1996.8.24”
pattern = r'(\w+)\s*:\s*(\d{4}).(\d{1,2}).(\d{1,2})'
match = re.search(pattern, '张伟: 1996.11.15')
if match:
[name, year, month, day] = match.groups()
# 转化为11月15日格式

birthday_str = f'{month}月{day}日'
# print('名字:', name)
# print('生日:', birthday_str)

# ② 可以直接创建文本内容 :text = "张伟的生日是11月15号"进行提取生日格式。
text = "张伟的生日是11月15号"
# 使用 findall() 方法搜索正则表达式的匹配项
matches = re.findall(r'(\d{1,2})月(\d{1,2})号', text)
# print('\n张伟的生日:')
# print(matches)

print('所有日期:')
print(date)
print('\n重新排版后日期规范为:')
print(formatted_dates)
print('\n1996年以前出生的信息:')
print(born_before_1996)
print('\n把所有1996年以前出生的年份改为1996:')
print(replaced_text)
print('名字:', name)
print('生日:', birthday_str)
print('\n张伟的生日:')
print(matches)
#@hfl

posted @ 2023-09-25 20:06  永不秃  阅读(14)  评论(0编辑  收藏  举报