开发者学堂课程【Python入门 2020年版:正则表达式作业】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/639/detail/10452
正则表达式作业
内容介绍
一、 题目一
二、 题目二
三、 题目三
四、 题目四
五、 题目五
一.题目一
1.要求
用户名匹配
(1)用户名只能包含数字字母下划线
(2)不能以数字开头
(3)长度在6到16位范围内
2.分析
只包含数字 字母 下划线 但是不能以数字开头 那就代表的是 开头的符号是 字母或者下划线确定了首位之后 剩余的 5到15位就是数字字母 下划线其中的内容
^以指定内容开头
$以指定内容结尾
3.代码
import re
#用户名匹配
#1.用户名只能包含数字、字母和下划线
#2.不能以数字开头
#3长度在6到16位范围
username =input('
请输入用户名:')
//加入模块
x=re.match(r'^[a-zA-Z_][a-zA-Z0-9_]{5,15}$',username)
//表示匹配到的结果。
加入开始符^和结尾符$可以完全匹配。也可以用 for match 进行完全匹配。
不能使用\D,\D 表示非数字但会使符号匹配,不能使用\W,因为其包括中文,所以使用[a-zA-Z_]来表示不以数字开头。
数字字母下划线表示为[a-zA-Z0-9_],6到16位出现的情况是开头出现一次,后面出现5-15次,所以6到16位表示为{5,15}
if x is None:
//如果 x 为空
print('
输入的用户名不符合规范')
else:
print(x)
//输出 x
二.题目二
1.要求
密码匹配
(1)不能包含!@#¥%^&*这些特殊符号
(2)必须以字母开头
(3)长度在6到12位范围内
2.分析
必须以字母开头 表示首位必须是字母
剩余的5到11位 中不包含指定的特殊字符[^abc]表示取反 不包含 abc 的含义
3.代码
#密码匹配
#1.不能包含!@%^&*字符2.必须以字母开头3.长度在6到12位
password = input('
请输入密码:')
y=re.fuLLmatch(r'[a-zA-Z][^!@#$%^&*]{5,11} ', password)
// [a-zA-Z]为以字母开头,[^!@#$%^&*]为不能包含!@%^&*字符,6到12位出现的情况是开头出现一次,后面出现5-11次,所以6到12位表示为{5,11}
if y is None:
//如果y为空
print('
密码不符合规范')
else:
print(y)
//输出 y
三.题目三
1.要求
已知有文件 test.txt 里面的内容如下:
1000phone hello python
mobiletrain 大数据
1000phone java
mobiletrain html5
mobiletrain 云计算
查找文件中以1000phone 开头的语句,并保存到列表中
2.分析
读取文件中的内容 因为文件中的数据是一行一行的 所以每行读取更方便
每一行都要检验一下 是否是以1000phone 开头的 是的话将其保存在列表中
3.代码
(1)方法一
z=[ ]
try:
with open('demo.txt', 'r', encoding='utf8') as file:
while True:
content = file.readline().strip('\n'
//去掉两行之间的空行
if not content:
//如果是空字符串
break
if re.match(r'^1000phone', content):
//如果以1000phone 开头则打印出来
z.append(content)
except FileNotfoundError:
print('
文件打开失败')
print(z)
方法二
Z=[ ]
try:
with open('demo.txt', 'r', encoding='utf8') as file:
content=file.read()//读出所有的内容z=re.findall(r'1000phone.*', content)
//以1000phone 为开头,当没有.*符号时只能读取1000phone 这几位。符号.表示包含除了换行以外的任意字符,有换行以外就不再继续。
except FileNotFoundError:
print('
文件打开失败')
print(z)
四. 题目四
1.要求
ipv4格式的 ip 地址匹配
提示:IP 地址的范围是0.0.0.0-255.255.255.255
2.分析
正则表达式 检验的是字符串 字符串中没有二百五十五这一说法只有二五五的说法 所以只能一位一位的检验
ip 地址的四个部分的正则要求是一样的 所以分析出来一部分 另外三个部分 就是 一样的正则格式了所以分析 其中一部分即可
每部分都是有可能由1位 2位3位组成
1位 0-9的组成
2位[1-9][0-9]组成
3位 以1开头的 后面两位都可以从0到9 1[0-9][0-9]
以2开头的 中间为0-4的后一位都可以是0-9
但是中间位为5 后一位只是0-5
然后根据分析组合在一起即可
3.代码
#ip 地址检测0.0.0.0~255.255.255.255
num=input('请输入一个数字:')
# 0~9 10~99 160~ 199 200~209 210~219 220~229 230~239 240~249 256~255
# \d: 一位数[1-9]\d:两位数 1\d{2}:1xx 2:00~255
X=re.fullmatch(r'((\d|[1-9]\d|1\d{2}|2([0-4]\d|5[0-5]))\.){3}(\d [1-9]\d|1\d{2}|2([0-4]\d|5[0-5]))',num
//\d 表示一位数 [1-9] \d 表示第一位不为0的两位数1\d{2}表示1xx 即1后接任意两个数字的三位数
print(x)
注意:
正则表达式是一个数字加.所以使用 r'\d|[1-9]\d|1\d{2}|2[0-5]{2}时会匹配不到因为没有把它分成一个整体,要进行分组才能运行成功
五. 题目五
1.要求
提取用户输入数据中的数值(数值包括正负数还包括整数和小数在内)并求和
例如:"-3.14good87nice19bye" =====> -3.14+87+19=102.86
2.分析
提取用户输入数据中的数值(数值包括正负数还包括整数和小数在内)并求和
整数:
1位数 0-9
2位数以上[1-9]+[0-9]
小数:
整数为有1位 [0-9].[0-9]*
整数位有2位及以上 [1-9][0-9].[0-9]*
表示负数 可有可无
3.代码
#非捕获分组
x=re.finditer(r'-?(0|[19]\d*)(\.\d+)?'
,’90good87ni0ce19bye')
//(r'-?代表有负数负数出现1次到0次,(0|[1-9]\d*)数字0和1-9出现多次,\.\d+出现多次并进行分组
for i in x:
print(i)
print(i.group())