一、实验目的:
- 熟悉字符串切片、运算等操作
- 掌握常用字符串操作函数和方法
- 掌握正则表达式
二、实验内容:
说明:基础题为必做题,提高题为选做题
1、 (基础题) 编写程序,要求用户输入一个身份证号,根据身份证号,显示输出出生年月日和性别。
程序代码:
def get_birth_date_and_gender(id_number):
# 验证身份证号码是否为18位
if len(id_number) != 18:
return "身份证号码格式错误,请输入18位身份证号码。"
try:
birth_date = id_number[6:14] # 身份证中的出生年月日部分
gender_digit = int(id_number[16]) # 性别部分
gender = "女" if gender_digit % 2 == 0 else "男"
# 格式化输出
birth_year = birth_date[:4]
birth_month = birth_date[4:6]
birth_day = birth_date[6:]
formatted_birth_date = f"{birth_year}年{birth_month}月{birth_day}日"
return f"出生日期: {formatted_birth_date}, 性别: {gender}"
except ValueError:
return "身份证号码包含非法字符。"
# 请求用户输入身份证号码
input_id_number = input("请输入您的身份证号码: ")
result = get_birth_date_and_gender(input_id_number)
print(result)
运行截图:
2、(基础题)求解字符串中所有数字的和:s = 'fdsd4gfdv2tgty67dcfd101dfds0vdsv3'(提示:isdigit()、isnumeric()、split()方法)
程序代码:
def sum_of_digits_in_string(s):
total_sum = 0
for char in s:
# 使用isdigit()检查字符是否为数字,它在字符是0-9时返回True
if char.isdigit():
total_sum += int(char) # 将字符转换为整数并加到总和中
return total_sum
# 给定的字符串
s = 'fdsd4gfdv2tgty67dcfd101dfds0vdsv3'
result = sum_of_digits_in_string(s)
print(f"字符串中所有数字的和是: {result}")
运行截图:
需要注意的是,
isnumeric()
方法在Python 3.0之后已经被废弃,因为它与str.isdigit()
方法相同,所以在这个例子中我们使用isdigit()
方法。此外,split()
方法在这个场景中没有直接使用,因为我们不需要分割字符串,只是需要遍历它。如果需要分割字符串并处理每个部分,可以使用split()
,但在这个特定的例子中,它不是必需的。
3、(基础题)编写程序,显示字符串“fjakdadaejkiafeqewiwonvm”,
- 要求统计字符串的长度;
- 去掉重复的字符,显示结果,并再次统计新字符串的长度,显示出来。
程序代码:
def remove_duplicates(s):
# 使用集合去除重复字符,然后转换回字符串
return "".join(sorted(set(s), key=s.index))
# 原始字符串
original_string = "fjakdadaejkiafeqewiwonvm"
# 统计原始字符串的长度
original_length = len(original_string)
print(f"原始字符串: {original_string}")
print(f"原始字符串长度: {original_length}")
# 去掉重复字符
new_string = remove_duplicates(original_string)
print(f"去掉重复字符后的字符串: {new_string}")
# 统计新字符串的长度
new_length = len(new_string)
print(f"新字符串长度: {new_length}")
运行截图:
这个程序首先定义了一个函数
remove_duplicates
,它使用集合(set)来去除字符串中的重复字符。集合是一个无序的不重复元素序列,所以当我们把字符串转换成集合时,所有重复的字符只会保留一个。然后,我们使用sorted()
函数和一个自定义的排序键来保持原始字符串中字符的顺序,最后将排序后的集合转换回字符串。接着,程序统计并打印原始字符串的长度,然后调用
remove_duplicates
函数处理字符串,并打印处理后的字符串及其长度。
4、 (基础题) 隐藏中奖信息中的手机号,例如:str = '中奖号码: 89483457 联系电话:13956485112',显示如下:
程序代码:
def hide_phone_number(phone_str):
# 找到字符串中的电话号码
phone_number = ""
for char in phone_str:
if char.isdigit():
phone_number += char
else:
break
# 隐藏电话号码中的部分数字
if len(phone_number) > 7: # 确保电话号码长度足够
hidden_number = phone_number[0] + "xxxxxxxxxx"
else:
hidden_number = phone_number # 如果电话号码长度不足7位,则不隐藏
return hidden_number
# 示例字符串
str = '中奖号码: 89483457 联系电话:13956485112'
print(f"原始字符串: {str}")
# 隐藏联系电话中的手机号
hidden_phone_str = str.replace("联系电话:" + str.split("联系电话:")[1], "联系电话:1xxxxxxxxxxxx")
print(f"隐藏手机号后的字符串: {hidden_phone_str}")
运行截图:
5、(提高题)编写程序,验证下述电子邮件的有效性。
'nobodyin@gmail.com.cn'
'bill.maria@yahoo.com'
'uncle.sam@mifty.com.org'
'united.china@163.com.it'
'doggy#sample.com'
'y_cat-st@example.com'
程序代码:
import re
def is_valid_email(email):
# 电子邮件的正则表达式
pattern = re.compile(r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$')
return pattern.match(email)
# 测试电子邮件列表
emails = [
'nobodyin@gmail.com.cn',
'bill.maria@yahoo.com',
'uncle.sam@mifty.com.org',
'united.china@163.com.it',
'doggy#sample.com',
'y_cat-st@example.com'
]
# 验证每个电子邮件
for email in emails:
result = "有效" if is_valid_email(email) else "无效"
print(f"电子邮件 '{email}' 是 {result}")
运行截图:
电子邮件地址通常遵循一定的格式规则,一般形式为
local-part@domain
,其中:
local-part
可以包含字母、数字、下划线、点、以及某些特殊字符。domain
通常是域名,以点分隔,最后一部分必须是一个有效的顶级域名(如.com
、.org
等)。