首页 > 其他分享 >10 正则表达式应用

10 正则表达式应用

时间:2023-02-05 16:12:21浏览次数:53  
标签:10 15 21 1996 正则表达式 date 应用 print re

name-date.txt 在文档最后

所有文件为:

 
 1、使用正则表达式将如下文字中合法的邮件地址输出。

“工作邮箱是:[email protected],生活中经常使用邮箱 [email protected],个人邮箱:[email protected],工作顺利...”

 

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

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

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

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

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

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

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

 

1 # 方法①
2 import os
3 import re
4 
5 text = "工作邮箱是:[email protected],生活中经常使用邮箱 [email protected],个人邮箱:[email protected],工作顺利..."
6 # 使用正则表达式查找所有合法的邮件地址
7 email_addresses = re.findall(r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b', text)
8 # 输出查找到的邮件地址
9 print("合法的邮件地址:", email_addresses)

 

 

 

 

 

 1 # 方法②
 2 import re
 3 
 4 # 定义一个用于匹配邮件地址的正则表达式模式
 5 pattern = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b'
 6 # 定义要搜索的文本
 7 text = "工作邮箱是:[email protected],生活中经常使用邮箱 [email protected],个人邮箱:[email protected],工作顺利..."
 8 # 使用findall()函数在文本中搜索所有符合正则表达式模式的字符串
 9 results = re.findall(pattern, text)
10 # 输出所有匹配到的邮件地址
11 for result in results:
12     print(result)

 

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

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

②提取其中所有的手机号。

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

 
 
 
 
 
3、文档中有一个记事本文件,文件名为out_2021.03.24.txt,使用正则表达式读取文件名中的日期时间信息,并找出这一天是周几。将文件改名为out_YYYY-MM-DD-W.txt (其中YYYY:四位的年,MM:两位的月份,DD:两位的日,W:一位的周几,并假设周一为一周第一天)。
 1 filename = "out_2021.03.24.txt"
 2 # 匹配年月日信息
 3 pattern = re.compile(r"out_(\d{4})\.(\d{2})\.(\d{2})\.txt")
 4 match = pattern.match(filename)
 5 if match:
 6     # 获取年月日信息
 7     year = match.group(1)
 8     month = match.group(2)
 9     day = match.group(3)
10     print("读取文件名中的日期时间信息:")
11     print(f"year: {year}, month: {month}, day: {day}")
12     # 计算这一天是周几
13     date = datetime.date(int(year), int(month), int(day))
14     print(f"weekday(这一天是周几): {date.strftime('%w')}")
15     # 构造新的文件名
16     new_filename = f"out_{year}-{month}-{day}-{date.strftime('%w')}.txt"
17     # 修改文件名,新的文件名将会替代原来的文件名,并保存在当前目录下
18     os.rename(filename, new_filename)
19     print("修改后的文件名将会保存到当前目录下")

注意:先创建文件名为out_2021.03.24.txt文件

 

 

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

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

 

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

         

运行结果

   

      输出日期的方法
 1  输出日期的方法
 2 # import os
 3 # import re
 4 # from datetime import datetime
 5 
 6 # 定义文件名
 7 # filename = "out_2021.03.24.txt"
 8 
 9 # 使用正则表达式解析文件名中的日期时间信息
10 # result = re.match(r'out_(\d{4})\.(\d{2})\.(\d{2})\.txt', filename)
11 
12 # 将解析后的年、月、日信息转换为 datetime 对象
13 # date = datetime.strptime(f"{result.group(1)}-{result.group(2)}-{result.group(3)}", "%Y-%m-%d")
14 
15 # 输出这一天是周几
16 # print(date.strftime("%A"))

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

①提取所有日期

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

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

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

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

 1 import re
 2 
 3 name_date = ""
 4 with open('name-date.txt', encoding='UTF-8') as f:
 5     for l in f:
 6         name_date += "".join(l.split("\n")) + "\n"
 7 date = re.findall("\d{4}[年.-]?\d{1,2}[月.-]?\d{1,2}\S?", name_date)
 8 # print('所有日期:')
 9 # print(date)
10 
11 #  重新排版, 日期规范 为“yyy年M月d日”
12 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)
13 # print('\n重新排版后日期规范为:')
14 # print(formatted_dates)
15 
16 #     提取所有 1996 年以前出生的学生
17 born_before_1996 = re.findall("\S+\s+1\d{2}[0-5][年.-]?\d{1,2}[月.-]?\d{1,2}\S?", name_date)
18 # print('\n1996年以前出生的信息:')
19 # print(born_before_1996)
20 
21 # 把所有1996年以前出生的年份改为1996
22 birth_year_replace_pattern = re.compile(r'(19\d{2})年')
23 replaced_text = birth_year_replace_pattern.sub('1996年', name_date)
24 # print('\n把所有1996年以前出生的年份改为1996:')
25 # print(replaced_text)
26 # 提取生日格式
27 # ① 由于 name_date.txt没有"张伟的生日是11月15号“匹配不到,所以可以把原文本“ 张伟 1996.11.15””改为“ 张伟 1996.8.24”
28 pattern = r'(\w+)\s*:\s*(\d{4}).(\d{1,2}).(\d{1,2})'
29 match = re.search(pattern, '张伟: 1996.11.15')
30 if match:
31     [name, year, month, day] = match.groups()
32 # 转化为11月15日格式
33 
34 birthday_str = f'{month}月{day}日'
35 # print('名字:', name)
36 # print('生日:', birthday_str)
37 
38 # ② 可以直接创建文本内容 :text = "张伟的生日是11月15号"进行提取生日格式。
39 text = "张伟的生日是11月15号"
40 # 使用 findall() 方法搜索正则表达式的匹配项
41 matches = re.findall(r'(\d{1,2})月(\d{1,2})号', text)
42 # print('\n张伟的生日:')
43 # print(matches)
44 
45 print('所有日期:')
46 print(date)
47 print('\n重新排版后日期规范为:')
48 print(formatted_dates)
49 print('\n1996年以前出生的信息:')
50 print(born_before_1996)
51 print('\n把所有1996年以前出生的年份改为1996:')
52 print(replaced_text)
53 print('名字:', name)
54 print('生日:', birthday_str)
55 print('\n张伟的生日:')
56 print(matches)
57 #@hfl
输出结果为:
所有日期:
['1996.11.15', '1993年10月21日', '1996年07月24日', '1996.3.21', '1996.12.0', '1996年07月05日', '1996.1.28', '1996年02月24日', '1996.5.28', '1996.10.26', '1993年1月6日', '1996.5.21', '1996年05月01日', '1996年04月14日', '1996.8.13', '1998年1月5日', '1996年08月21日', '1996年03月07日', '1996年03月18日', '1996年12月18日', '1995年5月7日']

重新排版后日期规范为:
张伟      1996年11日15日
王伟      1993年10日21日
王芳      1996年07日24日
李伟      1996年3日21日
王秀英      1996年12日0日
李秀英      1996年07日05日
李娜      1996年1日28日
张秀英      1996年02日24日
刘伟      1996年5日28日
张敏      1996年10日26日
李静      1993年1日6日
张丽      1996年5日21日
王静      1996年05日01日
王丽      1996年04日14日
李强      1996年8日13日
张静      1998年1日5日
李敏      1996年08日21日
王敏      1996年03日07日
王磊      1996年03日18日
李军      1996年12日18日
刘洋      1995年5日7日
   


1996年以前出生的信息:
['王伟      1993年10月21日', '李静      1993年1月6日', '刘洋   1995年5月7日']

把所有1996年以前出生的年份改为1996:
 张伟         1996.11.15
   王伟      1996年10月21日   
 王芳         1996年07月24日   
   李伟       1996.3.21  
   王秀英        1996.12.0  
   李秀英     1996年07月05日    
   李娜       1996.1.28   
   张秀英        1996年02月24日
    刘伟     1996.5.28
      张敏      1996.10.26
  李静      1996年1月6日    
   张丽        1996.5.21
    王静  1996年05月01日
    王丽   1996年04月14日  
   李强  1996.8.13   
   张静          1996年1月5日
    李敏    1996年08月21日
   王敏      1996年03月07日    
   王磊     1996年03月18日    
  李军         1996年12月18日  
    刘洋   1996年5月7日   

名字: 张伟
生日: 11月15日

张伟的生日:
[('11', '15')]

name-date.txt

张伟         1996.11.15
   王伟      1993年10月21日   
 王芳         1996年07月24日   
   李伟       1996.3.21  
   王秀英        1996.12.0  
   李秀英     1996年07月05日    
   李娜       1996.1.28   
   张秀英        1996年02月24日
    刘伟     1996.5.28
      张敏      1996.10.26
  李静      1993年1月6日    
   张丽        1996.5.21
    王静  1996年05月01日
    王丽   1996年04月14日  
   李强  1996.8.13   
   张静          1998年1月5日
    李敏    1996年08月21日
   王敏      1996年03月07日    
   王磊     1996年03月18日    
  李军         1996年12月18日  
    刘洋   1995年5月7日   

 

 

 

标签:10,15,21,1996,正则表达式,date,应用,print,re
From: https://www.cnblogs.com/huangfeilonghfl/p/17093500.html

相关文章

  • OWASP Top10漏洞
    Web安全的重要性基于Web环境的互联网应用越来越广泛,企业信息化的过程中各种应用都架设在Web平台上,Web业务的迅速发展也引起黑客们的强烈关注,接踵而至的就是Web安全威胁的凸......
  • 代码随想录算法训练营day18 | leetcode 513.找树左下角的值 ● 112. 路径总和 113.路
    LeetCode513.找树左下角的值分析1.0二叉树的 最底层 最左边 节点的值,层序遍历获取最后一层首个节点值,记录每一层的首个节点,当没有下一层时,返回这个节点classSoluti......
  • C# - VS2019 WINFRM应用程序开发报表
    简单报表我们可以通过label、textBox和PrintDialog来实现,但是一般在实际生产过程中,用户的报表需求一般都是比较复杂的。本篇主要记录对于传统中国式复杂报表的处理方法和......
  • 1012亿湘商回归“开门红”背后:星城筑巢引凤,湘商乘势而飞
    文|智能相对论作者|思存“惟楚有才,于斯为盛。”伴随着湖南崛起于中部,湘商回乡投资创业也已成为了热潮。经济总量、城市规模相继进入“万亿俱乐部”和特大城市之列的长沙......
  • win10格式化U盘提示没有权限执行此操作
    解决办法参考:http://www.tpbz008.cn/post/766.html 1、gpedit.msc 2、展开计算机配置,管理模板。展开系统。选中可移动存储访问  3、所有可移动存储类:拒绝所有权......
  • 3.5正则表达式和EXCESS系统
    尾数部分使用正则表达式(按照特定的规则来表示数据的形式即为正则表达式,除小数外,字符串以及数据库等都有各自的正则表达式),可以将表现形式多样的浮点数统一为一种表现形式。......
  • grep中的正则表达式使用
    ◆语法如下图所示、grep的命令行参数非常之多,在此,我们主要介绍如下使用方式:grep[-eexpression][filename]-e指定正则表达式-i不区分大小写-n显示行号  简......
  • 计算机进行小数运算时出错的原因——3.1将0.1累加100次也得不到10
    首先,我们来看一个计算机运算错误(无法得到正确结果)的例子。下图是将0.1累加100次,然后将结果输出到显示器上的C语言程序。运行过程是这样的:首先把0赋值给变量sum,然后在此......
  • 【UVA10943】How do you add?
    比较简单的数学题。先设状态,以分解出的个数\(m\)划分阶段,以数\(n\)划分子问题。则显然的,有\(f_{i,j}=\sum\limits_{0\lew\lej}f_{i-1,j-w}\)。这个式子啥意思......
  • 10磁盘管理命令(安装新硬盘)
    1.下载tree工具命令:  查看当前目录tree./:   ls -lh 可以在列出文件的同时查看文件的大小du命令:计算出所有目录及其子文件夹的大小,包括隐藏文件   在li......