实验六 字符串与正则表达式

实验六 字符串与正则表达式

一、实验学时:2学时

二、实验目的

  1. 掌握:字符串格式化方法;
  2. 掌握:字符串常用操作split()、strip()、translate()等方法使用;
  3. 掌握:正则表达式语法基本语法。
  4. 掌握:正则表达式模块re的常用函数用法。

三、实验内容

  1. 编写代码,根据完整路径从路径中分离文件路径(只需要分离出一个路径整体即可),文件名及文件扩展名。 str1 = “D:\ \软件\ \python\ \python39\ \Tools\ \scripts\ \abitype.py”
  2. 编写函数hanzi_count(str)统计任意字符串中汉字的个数。
  3. 编写函数trans(str)实现字符串中数字转化为大写汉字。例如 "0123456789"转化为 “零壹贰叁肆伍陆柒捌玖”。
  4. 编写程序,校验键盘录入的电子邮箱是否合法,并测试。
  5. 已知有字符串"张三 张四 王小玲 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的其他地方也是这样,我们必须按照代码要求,代码书写规范来写代码,不要按照自己习惯的格式来,要学会纠正自己的书写习惯。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是一只大狸子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值