Python实验三 字符串与正则表达式

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

一、实验学时: 2学时

二、实验目的

  1. 理解转义字符、ASCII、UTF-8的基本概念与应用;
  2. 掌握字符串常用方法。
  3. 掌握正则表达式基本语法;
  4. 理解正则表达式扩展语法;
  5. 掌握正则表达式模块re的常用函数;

三、实验内容

通过编写函数实现下述各题。

  1. 输入一字符串,各个子串之间按空白字符隔开,分别显示其中最长、最短子串,以及最大、最小字符。
  2. 输入单个字符,判断并显示该字符是否为大写英文字母、小写英文字母、非英文文字字符、空格、数字或者其它字符。
  3. 输入一字符串,各个子串之间按空白字符隔开,要求将其中的纯英文子串的大写字母改为小写,含数字的子串中的阿拉伯数字改写为对应的汉字,并且将所有空白字符改写为’%'。
  4. 字符串加密与解密,输入一字符串,按如下规则加密,将原文中每个字符转换为对应的ascii码后,再将该ascii码加上一100至200之间的整数得到的数值即为该字符对应的密文;解密即为上述过程的逆运算。将该字符串加密后再解密,并且显示原文、密文、解密后文本。
  5. 输入一字符串,要求统计出该字符串中出现频率最高的字符。
  6. 令字符串 s=‘马丽于2022-4-29 10:10刊发了一首诗《Listen to me》,诗词的大意是:\n Mama you taught me to do the right things,\n So now you have to let your baby fly.\n You’ve given me everything that I will need,\n To make it through this crazy thing called life,\n Thank you Mum!’ ,通过编写函数实现下述各题功能。
  • 1 应用正则表达式判断该字符串是否包含0~9的数字和大小写英文字母。

  • 2 根据正则表达式使用中文逗号、中文句号、英文逗号、英文点号、英文感叹号、英文换行符号将该字符串分割成多个子串。

  • 3 应用正则表达式提取该字符串中的日期时间字符串。

  • 4 应用正则表达式提取该字符串中的诗词名称。

  • 5 应用正则表达式提取该字符串中的姓名。

    四、实验结果

    (在此部分包括问题和解决办法、心得体会;列出保持缩进格式的程序代码及运行结果截图,请注意保持格式统一,截图清晰,大小合适)

  1. 输入一字符串,各个子串之间按空白字符隔开,分别显示其中最长、最短子串,以及最大、最小字符。
代码块:
 ```python
 #程序名:test3.1
 #功 能:输入一字符串,各个子串之间按空白字符隔开,分别显示其中最长、最短子串,以及最大、最小字符。
 #作 者:xx
 #日 期:2023.3.25
 #思 路:利用split()函数和len()函数比较即可
 
 s = input("请输入字符串:")
 
 s1 = s.split()
 
 x = ''.join(s1)     # 将子串拼接成一个字符串
 
 a = max(x)
 b = min(x)
 
 print("分隔后为:",s1)
 
 mi = str(s1[0])
 mx = ''
 for i in s1:
     if len(i) > len(mx):
         mx = i
     if len(i) < len(mi):
         mi = i
 
 print(f"最长子串为:{mx}")
 print(f"最短子串为:{mi}")
 
 print("最大字符为:",a)
 print("最小字符为:",b)
 
 ```
  1. 输入单个字符,判断并显示该字符是否为大写英文字母、小写英文字母、非英文文字字符、空格、数字或者其它字符。
代码块:
 ```python
 #程序名:test3.2
 #功 能:输入单个字符,判断并显示该字符是否为大写英文字母、小写英文字母、非英文文字字符、空格、数字或者其它字符。
 #作 者:xx
 #日 期:2023.3.25
 #思 路:利用选择语句和一些库函数判断即可
 
 s = input("请输入一个字符: ")
 
 if s.isalnum():
     print("这是一个英文字符:")
     if s.isupper():
         print("这个字符为大写英文字符")
     elif s.islower():
         print("这个字符为小写英文字母")
     else:
         print("这个字符为非英文字符")
         print("这个字符为数字")
 else:
     print("这个字符为非英文字符")
     if s.isspace():
         print("这个字符为空格")
     else:
         print("这是一个其他字符")
 
 ```
  1. 输入一字符串,各个子串之间按空白字符隔开,要求将其中的纯英文子串的大写字母改为小写,含数字的子串中的阿拉伯数字改写为对应的汉字,并且将所有空白字符改写为’%'。
代码块:
 ```python
 #程序名:test3.3
 #功 能:输入一字符串,各个子串之间按空白字符隔开,要求将其中的纯英文子串的大写字母改为小写,含数字的子串中的阿拉伯数字改写为对应的汉字,并且将所有空白字符改写为'%'。
 #作 者:xx
 #日 期:2023.3.25
 #思 路:利用maketrans()函数和translate()函数和replace()函数即可
 
 
 s = input("请输入一个字符串")
 
 standard = ' '.maketrans('0123456789', '零一二三四五六七八九')
 s = s.translate(standard)
 
 s = s.replace(' ','%')
 s = s.lower()
 print("变化后的字符串为:", s)
 
 ```
  1. 字符串加密与解密,输入一字符串,按如下规则加密,将原文中每个字符转换为对应的ascii码后,再将该ascii码加上一100至200之间的整数得到的数值即为该字符对应的密文;解密即为上述过程的逆运算。将该字符串加密后再解密,并且显示原文、密文、解密后文本。
代码块:
 ```python
 #程序名:test3.4
 #功 能:字符串加密与解密,输入一字符串,按如下规则加密,将原文中每个字符转换为对应的ascii码后,再将该ascii码加上一100至200之间的整数得到的数值即为该字符对应的密文;解密即为上述过程的逆运算。将该字符串加密后再解密,并且显示原文、密文、解密后文本。
 #作 者:xx
 #日 期:2023.3.25
 #思 路:利用random库中的函数随机生成一个数然后给ASII码相加后输出,然后再相减后输出即可
 
 import random
 
 s = input("请输入一个字符串:")
 
 print("原文为:", s)
 
 x = random.randint(100, 200)
 
 print("加的随机数是:", x)
 
 key = ''
 
 for ch in s:
     # 密钥为ASII码加随机生成数后的字符串
     key = key + chr(ord(ch) + x)
 
 # 输出密文
 print("密文为:", key)
 
 str2 = ''
 for ch in key:
     str2 = str2 + chr(ord(ch) - x)
 # 输出结果
 print("解密后的文本为:", str2)
 
 ```
  1. 输入一字符串,要求统计出该字符串中出现频率最高的字符。
代码块:
 ```python
 #程序名:test3.5
 #功 能:输入一字符串,要求统计出该字符串中出现频率最高的字符。
 #作 者:xx
 #日 期:2023.3.25
 #思 路:利用字典统计,输出values()最大即可
 
 s = input("请输入一个字符串:")
 
 x = dict()
 for ch in s:
     # 更新字符出现的次数或添加新元素
     x[ch] = x.get(ch, 0) + 1 
 
 # mx记录最多的次数
 mx = 0
 s1 = ''
 for key,value in x.items():
     if value > mx:
         mx = value
         s1 = key
 
 print("出现最多的字符为:", s1)
 print("出现的次数为:", mx)
     
 
 ```
  1. 令字符串 s=‘马丽于2022-4-29 10:10刊发了一首诗《Listen to me》,诗词的大意是:\n Mama you taught me to do the right things,\n So now you have to let your baby fly.\n You’ve given me everything that I will need,\n To make it through this crazy thing called life,\n Thank you Mum!’ ,通过编写函数实现下述各题功能。
  • 1 应用正则表达式判断该字符串是否包含0~9的数字和大小写英文字母。

  • 2 根据正则表达式使用中文逗号、中文句号、英文逗号、英文点号、英文感叹号、英文换行符号将该字符串分割成多个子串。

  • 3 应用正则表达式提取该字符串中的日期时间字符串。

  • 4 应用正则表达式提取该字符串中的诗词名称。

  • 5 应用正则表达式提取该字符串中的姓名。

代码块:
```python
#程序名:test3.6
#功 能:通过正则表达式实现函数功能
#作 者:xx
#日 期:2023.3.25

s = '马丽于2022-4-29 10:10刊发了一首诗《Listen to me》,诗词的大意是:\n Mama you taught me to do the right things,\n So now you have to let your baby fly.\n You`ve given me everything that I will need,\n To make it through this crazy thing called life,\n Thank you Mum!'

# 1.应用正则表达式判断该字符串是否包含0~9的数字和大小写英文字母。

import re

def is_digit_phy(Match):
    x = r'[a-zA-Z0-9]'        # r忽略转义字符
    s = re.findall(x, Match)
    return bool(s)

if is_digit_phy(s):
    print("字符串中包含0-9的数字和大小写英文字母!")
else:
    print("字符串中不包含0-9的数字和大小写英文字母!")

#  2.根据正则表达式使用中文逗号、中文句号、英文逗号、英文点号、英文感叹号、英文换行符号将该字符串分割成多个子串。

def _split(Match):
    x = r'[,。,.!\n]+'
    Match = re.split(x,Match)
    return Match

x1 = _split(s)
print("分隔后为:")
for i in x1:
    print(i, end = ' ')
print()

# 3.应用正则表达式提取该字符串中的日期时间字符串。

def find_date(Match):
    x = r'\d{4}-\d{1,2}-\d{1,2} \d{1,2}:\d{1,2}'
    Match = re.findall(x,Match)
    return Match

x2 = ''.join(find_date(s))
print("匹配的时间为", x2)

# 4.应用正则表达式提取该字符串中的诗词名称。

def find_popem(Match):
    x = r'《([a-zA-Z\s]+)》'
    Match = re.findall(x,Match)
    return Match

x3 = ''.join(find_popem(s))
print("匹配的古诗文名字为", x3)

# 5.应用正则表达式提取该字符串中的姓名。

def find_name(Match):
    x = r'[\u4e00-\u9fa5]{2,4}'
    Match = re.findall(x,Match)
    return Match

x4 = find_name(s)
print("匹配的姓名为", x4)

```

五、实验小结

(包括问题和解决办法、心得体会、意见与建议等)

问题和解决方法:

  1. 问题一:列表和字符串之间不会转换。
    解决方法:通过查询资料得知,列表转换为字符串可以用join()方法,更改后,程序正常运行。

  2. 问题二:在调用s.lower()方法时,输出结果s不变。
    解决方法:查询资料后,发现s.lower()方法无返回值,需要另一个变量去接收变化后的字符串。

  3. 问题三:不知道正则表达式中search()和match()和findall()方法的区别。
    解决方法:通过查询资料后得知,search是在整个字符串中寻找,match是从字符串的开始匹配,findall()是返回字符串中所有匹配项组成的列表。

心得体会:

  1. 正则表达式的功能非常强大,它通过制定一些规则来筛选字符串,减少了许多代码量。
  2. 字符串操作有许多办法,如建立一个映射关系,进行加密,平时要多敲代码,学会运用。
  3. ord()函数非常方便字符和ASII码之间的转换,在ASII码转字符时要用chr()进行强制转换。

你可能感兴趣的:(Python,python,正则表达式,开发语言)