实验六 字符串与正则表达式
一、实验学时:2学时
二、实验目的
- 掌握:字符串格式化方法;
- 掌握:字符串常用操作split()、strip()、translate()等方法使用;
- 掌握:正则表达式语法基本语法。
- 掌握:正则表达式模块re的常用函数用法。
三、实验内容
- 编写代码,根据完整路径从路径中分离文件路径(只需要分离出一个路径整体即可),文件名及文件扩展名。 str1 = “D:\ \软件\ \python\ \python39\ \Tools\ \scripts\ \abitype.py”
- 编写函数hanzi_count(str)统计任意字符串中汉字的个数。
- 编写函数trans(str)实现字符串中数字转化为大写汉字。例如 "0123456789"转化为 “零壹贰叁肆伍陆柒捌玖”。
- 编写程序,校验键盘录入的电子邮箱是否合法,并测试。
- 已知有字符串"张三 张四 王小玲 13208888123 4819599 zhangtom@126.com 676197687211@qq.com 1999-03-26 《凡人修仙传》《水浒传》", 设计正则表达式,并编写代码完成以下功能:
- 提取其中邮箱账号
- 提取手机号码
- 提取小说名称
- 提取日期
四、实验结果
1.编写代码,根据完整路径从路径中分离文件路径(只需要分离出一个路径整体即可),文件名及文件扩展名。 str1 = “D:\ \软件\ \python\ \python39\ \Tools\ \scripts\ \abitype.py”
题目思路:
利用split()以\进行分割,分割以后除了最后一项前面就是路径,最后利用join加上\即可,文件名即为最后一项,文件名由文件主名与文件扩展名,利用.去分割文件名,第二项即为扩展名。
程序代码:
"""
程序名:实验6.1.py
功能:编写代码,根据完整路径从路径中分离文件路径(只需要分离出一个路径整体即可),文件名及文件扩展名。
str1 = "D:\\软件\\python\\python39\\Tools\\scripts\\abitype.py"
日期:2022.5.3
版本:1.0
"""
str1 = "D:\\软件\\python\\python39\\Tools\\scripts\\abitype.py"
list1 = str1.split('\\') # 以\\分割字符串
list2 = list1[:len(list1) - 1:] # 除了最后一个字符串前面的都是文件路径
path = '\\'.join(list2) # 加上\\即为路径
name = str(list1[-1]) # 文件名
list3 = name.split('.') # 以.分割文件名,将文件名分成文件主名和文件扩展名
extension_name = str(list3[-1]) # 文件扩展名在.后面
print(f"文件路径为:{path}\n文件名为:{name}\n文件扩展名为:{extension_name}")
运行结果截图:
2.编写函数hanzi_count(str)统计任意字符串中汉字的个数。
题目思路:
利用string库里面的ascii_letters将字符串中符合条件的字母排除掉,然后利用alpha()函数剩下的即为中文,因为alpha除了会将字母返回True,中文也会返回True,可以利用这一特性。
程序代码:
"""
程序名:实验6.2.py
功能:编写函数hanzi_count(str)统计任意字符串中汉字的个数。
日期:2022.5.3
版本:1.0
"""
import string
def hanzi_count(str):
count = 0
for i in str:
if i in string.ascii_letters: # 先把字母筛选掉
pass
elif i.isalpha(): # 中文的汉字会被isalpha判定为True因此剩下的只有汉字
count += 1
print(f"汉字个数为:{count}")
str1 = input("请输入一段字符串:")
hanzi_count(str1)
运行结果截图:
3.编写函数trans(str)实现字符串中数字转化为大写汉字。例如 "0123456789"转化为 “零壹贰叁肆伍陆柒捌玖”。
题目思路:
首先写出翻译前和翻译后两张表,然后利用maketrans对应翻译表,最后利用translate()函数根据翻译表来转换字符串的字符。
程序代码:
"""
程序名:实验6.3.py
功能:编写函数trans(str)实现字符串中数字转化为大写汉字。
例如 "0123456789"转化为 "零壹贰叁肆伍陆柒捌玖"。
日期:2022.5.3
版本:1.0
"""
def trans(str):
intab = '0123456789' # 翻译前
outtab = '零壹贰叁肆伍陆柒捌玖' # 翻译后
transtab = str.maketrans(intab, outtab) # 制作翻译表
return str.translate(transtab) # 根据翻译表来转换字符串的字符
str1 = input("请输入一个字符串:")
print(f"转换后的字符串为:{trans(str1)}")
运行结果截图:
4.编写程序,校验键盘录入的电子邮箱是否合法,并测试。
题目思路:利用正则表达式匹配用户名 @ 域名即可。
程序代码:
"""
程序名:实验6.4.py
功能:编写程序,校验键盘录入的电子邮箱是否合法,并测试。
日期:2022.5.3
版本:1.0
"""
import re
def email_judge(email):
judge_format = r'^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$' # 用户名 @ 域名
if re.match(judge_format, email):
print("电子邮箱合法!")
else:
print("电子邮箱不合法!")
email1 = input("请输入电子邮箱:")
email_judge(email1)
运行结果截图:
5.已知有字符串"张三 张四 王小玲 13208888123 4819599 zhangtom@126.com 676197687211@qq.com 1999-03-26 《凡人修仙传》《水浒传》", 设计正则表达式,并编写代码完成以下功能:
- 提取其中邮箱账号
- 提取手机号码
- 提取小说名称
- 提取日期
题目思路:
邮箱账号: 用户名 @ 域名 手机号码:11位数字,第一位必须为1 小说名称:必须有书名号,书名号中间为文字 提取日期:四位年,两位月、日,都为数字格式。
程序代码:
"""
程序名:实验6.5.py
功能:已知有字符串"张三 张四 王小玲 13208888123 4819599 zhangtom@126.com 676197687211@qq.com 1999-03-26 《凡人修仙传》《水浒传》"
设计正则表达式,并编写代码完成以下功能:
提取其中邮箱账号
提取手机号码
提取小说名称
提取日期
日期:2022.5.3
版本:1.0
"""
import re
string1 = "张三 张四 王小玲 13208888123 4819599 zhangtom@126.com 676197687211@qq.com 1999-03-26 《凡人修仙传》《水浒传》"
def list_print(list1):
for i in list1:
print(i)
def extract_email(str1):
emails = re.findall(r'[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+\.[a-zA-Z0-9_-]+', str1) # 用户名 @ 域名
print("提取的邮箱账号为:")
list_print(emails)
def extract_phone_number(str1):
phone_number = re.findall(r'1\d{10}', str1) # 电话号码为11位,第1位为1
print("提取的手机号码为:")
list_print(phone_number)
def extract_novel_name(str1):
novel_name = re.findall(r'《[\u4e00-\u9fa5]+》', str1) # 利用unicode编码匹配中文
print("提取的小说名字为:")
list_print(novel_name)
def extract_date(str1):
date = re.findall(r'\d{4}-\d{1,2}-\d{1,2}', str1) # 利用{1,2}表示匹配前面的\d一次或者两次
print("提取的日期为:")
list_print(date)
extract_email(string1)
extract_phone_number(string1)
extract_novel_name(string1)
extract_date(string1)
运行结果截图:
五、实验小结
问题和解决办法:
1.正则表达式中的某些表达式不熟悉例如如何匹配最开始字符,如何匹配中文等。
解决方法:
通过查书和上网查询寻求解决
2.不太理解合法的电子邮箱应具备哪些条件
解决方法:
通过查询相关电子邮箱信息获得解决
3.在写正则表达式中,明明对应的匹配是正确的,但是就是无法匹配到。
解决方法:
在正则表达式中,要严格按照要求来进行写,比如多一个空格之类的都可能导致错误。
心得体会:
1.通过对正则表达式的应用,让我对python的功能又一次得到了加强认识。正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配,利用正则表达式,能够让我们对一些匹配字符、查找某些格式的文字更加的方便快捷。而且正则表达式可以进行任意格式的匹配,这样在我们的日常生活中也可以进行使用。
2.在写代码中要严格按照代码格式来,不要认为多一个空格,一个换行会影响不大,在正则表达式中,我深刻体会到代码格式严谨的重要性。在写python的其他地方也是这样,我们必须按照代码要求,代码书写规范来写代码,不要按照自己习惯的格式来,要学会纠正自己的书写习惯。