实验三 字符串与正则表达式
一、实验学时: 2学时
二、实验目的
- 理解转义字符、ASCII、UTF-8的基本概念与应用;
- 掌握字符串常用方法。
- 掌握正则表达式基本语法;
- 理解正则表达式扩展语法;
- 掌握正则表达式模块re的常用函数;
三、实验内容
通过编写函数实现下述各题。
- 输入一字符串,各个子串之间按空白字符隔开,分别显示其中最长、最短子串,以及最大、最小字符。
- 输入单个字符,判断并显示该字符是否为大写英文字母、小写英文字母、非英文文字字符、空格、数字或者其它字符。
- 输入一字符串,各个子串之间按空白字符隔开,要求将其中的纯英文子串的大写字母改为小写,含数字的子串中的阿拉伯数字改写为对应的汉字,并且将所有空白字符改写为’%'。
- 字符串加密与解密,输入一字符串,按如下规则加密,将原文中每个字符转换为对应的ascii码后,再将该ascii码加上一100至200之间的整数得到的数值即为该字符对应的密文;解密即为上述过程的逆运算。将该字符串加密后再解密,并且显示原文、密文、解密后文本。
- 输入一字符串,要求统计出该字符串中出现频率最高的字符。
- 令字符串 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.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)
```
- 输入单个字符,判断并显示该字符是否为大写英文字母、小写英文字母、非英文文字字符、空格、数字或者其它字符。
代码块:
```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("这是一个其他字符")
```
- 输入一字符串,各个子串之间按空白字符隔开,要求将其中的纯英文子串的大写字母改为小写,含数字的子串中的阿拉伯数字改写为对应的汉字,并且将所有空白字符改写为’%'。
代码块:
```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)
```
- 字符串加密与解密,输入一字符串,按如下规则加密,将原文中每个字符转换为对应的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)
```
- 输入一字符串,要求统计出该字符串中出现频率最高的字符。
代码块:
```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)
```
- 令字符串 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)
```
五、实验小结
(包括问题和解决办法、心得体会、意见与建议等)
问题和解决方法:
-
问题一:列表和字符串之间不会转换。
解决方法:通过查询资料得知,列表转换为字符串可以用join()方法,更改后,程序正常运行。 -
问题二:在调用s.lower()方法时,输出结果s不变。
解决方法:查询资料后,发现s.lower()方法无返回值,需要另一个变量去接收变化后的字符串。 -
问题三:不知道正则表达式中search()和match()和findall()方法的区别。
解决方法:通过查询资料后得知,search是在整个字符串中寻找,match是从字符串的开始匹配,findall()是返回字符串中所有匹配项组成的列表。
心得体会:
- 正则表达式的功能非常强大,它通过制定一些规则来筛选字符串,减少了许多代码量。
- 字符串操作有许多办法,如建立一个映射关系,进行加密,平时要多敲代码,学会运用。
- ord()函数非常方便字符和ASII码之间的转换,在ASII码转字符时要用chr()进行强制转换。