要求:
1、使用re模块的match函数验证输入的字符串是否为有效的电子邮件地址:A@B.C。其中A为6至15个数字或英文字母;B为2至10个数字或英文字母;C只能是com、cn或net。
2、程序保存到:s13t1.py
3、程序执行效果1:
输入邮件地址:user123@example.com
检查结果=有效
4、程序执行效果2:
输入邮件地址:123ww@example.org
检查结果=无效
【参考与提示】
利用re模块的match函数可从字符串的起始位置开始匹配。
1、格式:match(p,s,f)
(1)p:指定正则表达式
(2)s:要匹配的字符串
(3)f:匹配标志
2、正则表达式应指定:
(1)A匹配数字或英文字母:"[0-9a-zA-Z]",使用{m,n}格式限制匹配至少m次,最多n次。B匹配设置类同。
(2)C匹配"(com|cn|net)"。
(3)必须匹配行尾。
import re
# 定义邮箱地址的正则表达式模式
# ^:匹配字符串的开始位置
# [0-9a-zA-Z]{6,15}:匹配6到15位的数字或字母(邮箱用户名部分)
# @:匹配邮箱地址中的@符号
# [0-9a-zA-Z]{2,10}:匹配2到10位的数字或字母(邮箱域名的第一部分)
# \.:匹配邮箱地址中的点号(需要转义)
# (com|cn|net):匹配邮箱域名的后缀,限定为com、cn或net中的一个
# $:匹配字符串的结束位置
pattern = r'^[0-9a-zA-Z]{6,15}@[0-9a-zA-Z]{2,10}\.(com|cn|net)$'
email = input("输入邮件地址:")
# 使用re.match( )函数在字符串的开始位置进行模式匹配
# 如果匹配成功,返回一个匹配对象;否则返回None
result = re.match(pattern, email)
if result:
print("检查结果=有效")
else:
print("检查结果=无效")
任务2 re模块-使用search函数
要求:
1、使用re模块的search函数从输入的字符串中提取前2个小数。假定小数个数不少于2个,不考虑负号。
2、程序保存到:s13t2.py。
3、程序执行效果:
输入字符串:ka%15.9adv7.8%uybd5.6cc
提取结果=15.9,7.8
【参考与提示】
利用re模块的search函数可从字符串的任意位置开始匹配,并通过函数返回的Match对象的groups函数得到提取结果。
1、格式:search(p,s,f)
(1)p:指定正则表达式
(2)s:要匹配的字符串
(3)f:匹配标志
2、正则表达式应指定为"A.*\D+B"格式.其中".*\D"表示任意个字符后至少1个非数字字符。A,B为小数限制(应为模式组)。
import re
s = input("输入字符串:")
# 正则表达式解析:
# (\d+\.\d+):这是一个捕获组,用于匹配一个小数。\d+ 表示匹配一个或多个数字,\. 表示匹配小数点,所以该捕获组可以匹配如 12.34 这样的小数
# \D+:匹配一个或多个非数字字符(如字母、符号等),用于分隔两个小数
# (\d+\.\d+):第二个捕获组,同样匹配一个小数
match = re.search(r'(\d+\.\d+)\D+(\d+\.\d+)', s)
# 提取匹配到的两个小数,并使用逗号连接成字符串
# match.group(1):获取第一个捕获组的内容(即第一个小数)
# match.group(2):获取第二个捕获组的内容(即第二个小数)
result = f"{match.group(1)},{match.group(2)}"
print(f"提取结果={result}")
任务3 re模块-使用findall函数
要求:
1、使用re模块的findall函数从输入字符串中提取所有电子邮箱地址并显示。假定电子邮箱地址为"A@B"格式:
(1)A仅包含英文字母或数字,长度为4至10。
(2)B为"qq.com"或"sina.cn"。
2、程序保存到:s13t3.py
3、程序执行效果:
输入字符串:a=x8u1@qq.com,b=x215@sina.com.cn.
提取结果:
x8u1@qq.com
x215@sina.com.cn
【参考与提示】
求解思路:
1、使用findall函数搜索。
2、正则表达式为"A@B"形式:
(1)A:使用[]限制可用字符,{m,n}限制长度。
(2)B:使用"|"匹配(需分组但不作子模式)。
3、使用循环语句输出findall函数的返回值(列表)的元素(即搜索出的电子邮件地址)。
import re
s = input("输入字符串:")
# 正则表达式 r'[A-Za-z0-9]{4,10}@(?:qq\.com|sina\.com\.cn)' 的含义如下:
# [A-Za-z0-9] 表示一个字符集,匹配任意一个大写字母(A - Z)、小写字母(a - z)或数字(0 - 9)
# {4,10} 是一个量词,规定前面的字符集必须连续出现 4 到 10 次,用于匹配邮箱地址中用户名的部分
# @:是邮箱地址中用户名和域名的分隔符
# (?:qq\.com|sina\.com\.cn):
# (?: ... ) 是一个非捕获组,它的作用是对其中的内容进行分组,但不捕获匹配结果
# qq\.com|sina\.com\.cn 表示一个或关系,即可以匹配 "qq.com" 或者 "sina.com.cn",用于匹配邮箱地址的域名部分
# 其中的 \. 是对 . 的转义,因为在正则表达式中 . 有特殊含义,需要用 \. 来表示真正的点号
pattern = r'[0-9a-zA-Z]{4,10}@(?:qq\.com|sina\.com\.cn)'
email_list = re.findall(pattern, s)
print("提取结果:")
for email in email_list:
print(email)
任务4 re模块-使用sub函数
要求:
1、将输入的点坐标序列的每个点的两个坐标(均为非负整数)互换
2、输出处理后的字符串。
3、程序保存到:s13t4.py
4、程序执行效果:
输入字符串:(3,2),(5,6)
替换结果:(2,3),(6,5)
【参考与提示】
re模块的sub函数用于将匹配到的数据进行替换,并返回替换后的字符串。
求解思路:
调用re模块的sub函数进行替换:
1、正则表达式设置为"AB,CD"形式:
(1)A:为"(",但不能直接使用,需转义。
(2)B:为模式组,限制点的第一个坐标。
(3)C:为模式组,限制点的第二个坐标。
(4)D:为")",但不能直接使用,需转义。
2、参数repl需指定为"(A,B)"形式,A为第二组的编号,B为第一组的编号。
import re
s = input("输入字符串:")
# 正则表达式 r'\((\d+),(\d+)\)'解析:
# \( 表示匹配左括号 (,需要转义
# (\d+) 是第一个模式组,用于匹配一个或多个数字,代表点的第一个坐标
# , 表示匹配逗号
# (\d+) 是第二个模式组,用于匹配一个或多个数字,代表点的第二个坐标
# \) 表示匹配右括号 ),需要转义
pattern = r'\((\d+),(\d+)\)'
# 使用 re.sub 函数进行替换
# r'(\2,\1)' 是替换规则,\2 表示第二个模式组匹配的内容,\1 表示第一个模式组匹配的内容
# input_str 是要进行替换操作的字符串
result = re.sub(pattern, r'(\2,\1)', s)
# 输出替换结果
print(f"替换结果:{result}")
任务5 自定义模块
要求:
1、自定义模块:
(1)编写函数count(s),用于统计字符串s中小写英文字母出现的个数。
(2)保存到:mk13t5.py
2、编写主程序:
(1)导入上面定义的模块。
(2)调用自定义模块中的count函数,计算输入的字符串中小写英文字母出现的个数。
(3)程序保存到:s13t5.py。
(4)程序执行效果:
输入1个字符串:35abD88acdfA=9
小写英文字母个数=6
【参考与提示】
自定义模块与主程序在同一个文件夹,主程序可直接导入该模块。
# 自定义模块 mk13t5
def count(s):
"""
此函数用于统计字符串 s 中小写英文字母出现的个数
:参数 s: 输入的字符串
:返回值: 小写英文字母的个数
"""
num = 0
for c in s:
if 'a' <= c <= 'z':
num = num + 1
return num
# s13t5.py
# 导入自定义模块 mk13t5
import mk13t5
s = input("输入1个字符串:")
# 调用自定义模块中的 count 函数,统计小写英文字母的个数
result = mk13t5.count(s)
print(f"小写英文字母个数={result}")

