【问题描述】K85100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
给定一段文字“2020级电商1班和2021级计算机3班志愿服务队是我校志愿服务总队领导下的志愿团体”,找出其中的班级名称,并输出结果。K85100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
输出结果:K85100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
结果1:<re.Match object;span=(0,9),match='2020级电商1班'>K85100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
结果2-1:<re.Match object;span=(0,9),match='2020级电商1班'>K85100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
结果2-2:2020级电商1班K85100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
结果3:['2020级电商1班','2021级计算机3班']K85100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
【题前思考】K85100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
根据问题描述,填写表10-1-1。K85100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
表10-1-1 问题分析K85100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
K85100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
【解题思路】K85100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
首先,班级名称由年级、专业和班号构成,具体的格式为××××级+专业+×班,×为一个数字,“专业”可能为若干个任意字符,“级”和“班”是固定的字符;其次,写出正确的正则表达式描述这种格式;最后,编写代码验证功能。K85100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
【程序代码】K85100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
K85100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
K85100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
【代码分析】K85100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
①:导入正则表达式模块re。K85100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
②:变量s为待分析的字符串,其中班级名称的格式为××××级+专业+×班,×为一个数字。K85100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
③:pattern1字符串是一个正则表达式,又称为样式,用来描述班级名称。其中,“\d、\S、级、班”称为元字符,分别表示匹配数字、任何非空白字符和汉字“级”“班”。“+”是量词,“\S+”指前面的非空白字符出现1到多次。“?”表示非贪婪模式。匹配过程如图10-1-1所示。K85100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
④:调用re.match( )方法匹配样式,匹配成功,rs是match类的对象,如果没有匹配,rs为none。K85100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
⑤:打印rs,可以看到结果为match类的对象,称为匹配对象。K85100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
⑥:pattern1中“\d\d\d\d”连续匹配4个数字,可以用pattern2中“\d{4}”简写。“{4}”是量词,表示其前面的“\d”刚好出现4次。匹配过程如图10-1-2所示。K85100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
K85100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
图10-1-1 pattern1的匹配样式K85100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
K85100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
图10-1-2 pattern2的匹配样式K85100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
⑦:使用正则表达式pattern2匹配,结果保存到rs1中。K85100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
⑧:打印rs1,可以看到结果为匹配对象。K85100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
⑨:调用匹配对象的group( )方法,输出匹配到的字符串。注意只输出了一个班级名称。K85100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
⑩:re.match( )方法从第一个字符开始匹配且只匹配一次。为了找到所有的班级名称,可以调用re.findall( )方法,该方法返回一个列表。匹配过程如图10-1-3所示。K85100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
:输出rs2,可以看到匹配结果是一个列表。K85100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
K85100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
图10-1-3 使用findall( )方法匹配多个字符串K85100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
【优化提升】K85100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
在上例中,每次执行正则表达式都需要解释器重新编译。如果一个正则表达式被多次调用,可以使用re.compile( )方法将其编译为一个正则表达式对象(Pattern对象),通过调用这个对象的match( )、search( )、findall( )等方法,可以提高程序的运行效率。K85100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
采用下面两条语句,同样可以找到s中的所有班级名称。K85100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
pattern2=re.compile('\d{4}级\S+?\d班')K85100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
rs2=pattern2.findall(s)K85100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
【技术全貌】K85100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
量词的形式为{n,m},其中n和m分别表示使用该量词的表达式必须匹配的最少次数和最多次数。贪婪量词总是尽量匹配更多的字符,先看整个字符串是不是一个匹配。如果没有发现匹配,它去掉字符串中的最后一个字符,并再次尝试。非贪婪量词正好相反,先看字符串中的第一个字母是不是一个匹配;如果单独这一个字符还不够,就读入下一个字符,组成两个字符的字符串;如果还是没有发现匹配,继续添加字符直到发现一个匹配或者整个字符串都检查过也没有匹配。表10-1-2列举了常见的量词形式。表10-1-3列出了需要记忆的常用特殊符号,称为元字符。表10-1-4列出了re模块的常用函数。表10-1-5列出了匹配对象(match)的属性和方法。表10-1-6列出了模式对象(pattern)的属性和方法。K85100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
表10-1-2 量词的形式K85100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
K85100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
表10-1-3 常见元字符K85100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
K85100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
注:如果需要匹配符号".",可以使用转义字符"\."。K85100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
表10-1-4 re模块的常用函数K85100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
K85100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
续表K85100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
K85100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
表10-1-5 匹配对象(match)的属性和方法K85100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
K85100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
表10-1-6 模式对象(pattern)的属性和方法K85100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
K85100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
注:re模块中的方法对于pattern都适用,只是少了pattern参数。K85100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
K85100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库