Python 正则表达式 对应实例 从教务处展示成绩页面的表格源代码中 获取课程、学分、成绩
发布日期:2021-05-06 22:50:21 浏览次数:25 分类:技术文章

本文共 2295 字,大约阅读时间需要 7 分钟。

在我看来re模块是一个很实用、很重要的模块,可以帮我们过滤不想要的字符。而且很灵活,越用越上瘾。

感觉我找到的教程都不太好,有的只有罗列式子,没有实例很抽象。

自己整理一下,方便自己看,也供大家参考。

目前还未整理完,也没有按顺序,只是个开始。

传送门:

re.sub 过滤/去除指定内容
re.findall 找到想要的内容

re.sub函数:

re.sub(正则匹配表达式,匹配后要替换的字符,原字符串)

正则匹配表达式: r’[填入以下式子]’
匹配数字 \d
非数字 \D
非标点符号 \w
标点符号 \W
汉字 \u4e00-\u9fa5
任意单个字符 直接写单个字符

如果只用一个条件,可以不加列表[],即:r’\d’ 跟r’[\d]’ 效果是一样的

但匹配汉字要加,即:r’[\u4e00-\u9fa5]’

所以建议直接加上[]。

匹配多个条件,我既匹配数字,又要汉字的话,用逗号隔开就好。

r’[ \d, \u4e00-\u9fa5 ]’

其实r可加可不加!自己删掉试试?

示例:

import re#原字符串string = "hello world! I'm glad to see you here. This is 404detecitve. 你好,世界!我很高兴在这见到你。"#匹配e,替换为E。replacedString = re.sub(r'[a]', "A", string)#输出:hEllo world! I'm glad to sEE you hErE. This is 404dEtEcitvE. 你好,世界!我很高兴在这见到你。#匹配汉字,替换为空(删除)。replacedString = re.sub(r'[\u4e00-\u9fa5]', "", string)#输出:hello world! I'm glad to see you here. This is 404detecitve. ,!。#匹配标点符号,替换为空格。(注意' '里面有空格,跟上面不一样!)replacedString = re.sub(r'[\W]', " ", string)#输出:hello world  I m glad to see you here  This is 404detecitve  你好 世界 我很高兴在这见到你print("replacedString = ", replacedString)

re.findall函数:

re.findall(正则匹配表达式,原字符串,其他修饰条件)

找到后放入列表返回

如果我们想要的东西在<>里面

<内容>
我们可以用r’<(.*?)>'来匹配它

修饰条件: 含义
re.I 匹配对大小写不敏感
re.S 匹配包括换行在内的所有字符(把换行表示为字符\n)

示例:

r可加可不加!上面加了,下面就不加了

string = '''
12
23
34
12< f>23
34
''' No_S = re.findall('<(.*?)>',string) Yes_S = re.findall('<(.*?)>',string,re.S) print ('No_re.S is ' ,No_S) #No_re.S is ['aa', 'b', 'c', 'd', 'g', 'h'] !!!不加re.S只能匹配第一个\n(换行)之前的内容!!! 所以没有e print ('Yes_re.S is ' ,Yes_S) #Yes_re.S is ['aa', 'b', 'c', 'd', 'e\n', '\nf', 'g', 'h']

取一下教务处里的成绩,我将展示成绩的页面表格部分代码copy在了记事本里。

在这里插入图片描述
通过观察我们发现了想要内容左右代码的共同之处。

代码如下:

import rewith open('re.txt','r',encoding='utf-8') as f:    string=(f.read())    #print(txt)    course=re.findall('kcmc">(.*?)',string)print ('课程为 ' ,course)课程为  ['军事理论及训练', '大学计算机基础实验', '高等数学A1', '思想道德修养与法律基础', '马克思主义基本原理', '普通体育课1', '大学生生涯规划', '大学英语B1', '大学计算机基础', '工程制图与电气CAD']credit=re.findall('xf">(.*?)',string)print ('学分为 ' ,credit)学分为  ['1.0', '0.5', '5', '2', '3', '1', '0.5', '2', '1.5', '2.5']grade=re.findall('cj">(.*?)',string)print ('成绩为 ' ,grade)成绩为  ['95', '95', '优秀', '95', '99', '99', '90', '90', '85', '85', '93', '93', '92', '92', '99', '99', '94', '94', '93', '93']

效果如下

在这里插入图片描述
翻车了!在这里插入图片描述
还有其他带着cj’'的标签,于是经过更改(让匹配更详细即可)
在这里插入图片描述

not end

未完待续…

上一篇:仅仅9行代码 爬取教务处成绩 仅用2个模块 正方教务系统
下一篇:计算机三级 信息安全技术历年真题(二)总共十套 3月底之前更完

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2025年03月15日 16时57分31秒